文件操作的基本流程
# 打开文件 f = open('test.txt', 'r', encoding='utf-8') # 读取文件内容 data = f.read() print(data) # 关闭文件 f.close()
with上下文管理
在进行文件操作时,总是需要频繁地打开文件、关闭文件,非常的不方便,使用with就可以自动关闭文件
with open('test.txt', 'r', encoding='utf-8') as f: data = f.read() print(data)
文件的操作模式
r:(默认的)只读模式
w:只写模式
a:只追加模式
只读模式下,如果需要打开的文件不存在,则报错。如果存在,则文件指针自动跳到文件开头
只写模式下,如果需要打开的文件不存在,则新建一个文件。如果存在,则清空文件
只追加模式下,文件不存在会创建文件,如果文件存在,则文件指针自动跳到文件末尾
r+:在只读模式下,增加写功能,如果需要打开的文件不存在,则报错。如果存在,则文件指针自动跳到文件开头
w+:在只写模式下,增加读功能,如果需要打开的文件不存在,则新建一个文件。如果存在,则清空文件
a+:在只追加模式下,增加读功能,文件不存在会创建文件,如果文件存在,则文件指针自动跳到文件末尾
PS:一般不会使用可读写模式
控制文件读写内容的模式
t模式:(默认的)文本模式
b模式:二进制模式,读写单位:bytes
操作文件的方法
f.read() # 读取所有内容 f.readline() # 读取一行内容 f.readlines() # 读取每一行的内容,存放于列表中
read和readlines都会把所有的内容写入内存,这样,在文件过大时会特别消耗内存,所以推荐一行一行地读,或者规定一次读取多少个单位
with open('test.txt', 'rt', encoding='utf-8') as f: for line in f: print(line, end="")
with open('test.txt', 'rt', encoding='utf-8') as f: while True: date = f.read(1024) if len(date) == 0: break print(date)
文件写操作
# 写操作 f.write('1111\n222\n') # 针对文本模式的写,需要自己写换行符 f.write('1111\n222\n'.encode('utf-8')) # 针对b模式的写,需要自己写换行符 f.writelines(['333\n','444\n']) # 文件模式 f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式 作者:程序员Egon老湿 链接:https://zhuanlan.zhihu.com/p/108808704 来源:知乎
了解
f.readable:文件是否可读
f.writable:文件是否可写
f.closed:文件是否关闭
f.encoding:文件编码方式,如果打开模式为b,则没有这个属性
f.flush:立刻将文件内容从内存刷到硬盘
f.name:文件的名称
文件指针的移动
f.read:在t模式下以字符为单位,在b模式下以字节为单位,只能朝一个方向移动
f.seek移动指针,同样在t模式下是以字符为单位,在b模式下以字节为单位
f.seek(移动多少单位,模式)
0模式:参照文件开头
1模式:参照文件当前位置
2模式:参照文件末尾移动。f.seek(0,2)表示移动到文件末尾
PS:在utf-8编码下,一个汉字一般是3个字节,一个英文字母一般是1个字节
文件修改的两种方式
方式一
with open('test.txt', 'rt', encoding='utf-8') as f: data = f.read() with open('test.txt', 'wt', encoding='utf-8') as f: f.write(data)
优点:文件修改过程中,同一份数据只有一份
缺点:一次性读入内存,会过多地占用内存
方式二
import os with open('test.txt', 'rt', encoding='utf-8') as f, open('test1.txt', 'wt', encoding='utf-8') as f2: for line in f: f2.write(line.replace('1', '33333')) os.remove('test.txt') os.rename('test1.txt', 'test.txt')
优点:不会占用过多的内存
缺点:同一份数据存了两份