文件的操作
打开文件三要素
路径、打开方式、编码格式。不标注打开方式默认为只读。
f1 = open('D:\a.txt', encoding='utf-8', mode='r')
f1 为文件句柄,也叫文件对象,所有的读写操作都是通过文件句柄完成的
文件操作的三要素
生成文件句柄
文件的读/写,文件写操作必须以写形式打开文件,文件读操作必须以读或读写操作打开文件
关闭文件句柄(若不关闭,则占用内存资源)
文件的读
read #整个文件内容全部读取到内存中去,形成一个字符串
f1 = open('D:\a.txt', encoding='utf-8', mode='r') content = f1.read() print(content) f1.close()
read(n) #按照指定的字节数或字符数读取
log 文件中内容为:我爱你中国
当文件以r模式打开,n表示字符个数 f1 = open('log',encoding='utf-8',mode='r') content = f1.read(3) print(content,type(content)) 我爱你 <class 'str'>
f1.close()
当文件以rb 模式代开,n表示字节数
f1 = open('log',mode='rb') #bytes 模式打开,不可以指定编码格式,是什么格式就以什么格式打开
content = f1.read(3) #编辑器编码为utf-8,而中文的utf-8 编码为3个字节表示一个文字。
print(content,type(content))
c = content.decode(encoding='utf-8')
print(c)
b'\xe6\x88\x91' <class 'bytes'>
我
f1.close()
readline #每次读取一行,按顺序读取,读取内容以字符串格式存在
log 文件内容 1 我爱你中国 2 alksdkjdsa 3 jldfj 4 k 5 ... f1 = open('log',encoding='utf-8',mode='r') content = f1.readline() print(content) print(f1.readline()) print(f1.readline())
1 我爱你中国
2 alksdkjdsa
3 jldfj
f1.close()
readlines #读取整个文件,把文件的每一行作为一个元素组成一个列表,不仅读取每一行内容还有换行符也一并读取。
f1 = open('log',encoding='utf-8',mode='r') content = f1.readlines() print(content) ['1 我爱你中国\n', '2 alksdkjdsa\n', '3 jldfj\n', '4 k\n', '5 ...']
f1.close()
for 循环读取文件 #可以迭代式的逐行读取,读取一行完毕后自动从内存中清除,再读取下一行。不耗费内存,适合读取大文件
f1 = open('log', encoding='utf-8') for i in f1: print(i) f1.close()
whith open as ... #无需关闭文件句柄
whith open('log',encoding='utf-8',mode='r') as f1: content = f1.read
r+ #文件的读写,可以读也可以写,但是不常用
文件指针操作
无论是文件的读还是写,读写操作后文件的指针都会停留在操作后的位置,例如readline 读取一行文件,指针就到了这一行的末尾,read读取全文,那么指针就到了文件最后。
seek(offset,whence)
-
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
-
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
log 文件内容 abcdefg f1 = open('log', encoding='utf-8', mode='r') f1.seek(2,0) #以文件开头作为起始偏移量未二个字节 print(f1.read()) f1.close() 输出: cdefg
seek(0) #表示回到文件的开始
seek(0,2) #表示回到文件的结尾
tell() 获取当前文件指针位置(字节)
log 内容 abcdefg f2 = open('log',encoding='utf-8') f2.read() print(f2.tell()) #英文字母一个字母对应一个字节 7 log1 内容 abcdefg文 f3 = open('log1',encoding='utf-8') f3.read() print(f3.tell()) #utf-8编码下中文字符占3个字节 10
文件的写
w 写模式 #覆盖写入,如果文件事先不存在则创建。文件打开的那一刻就已经清空了文件原有的内容,此处再用seek()已经无任何作用
w+ 写读模式 #可以写也可以读。与w 特性完全一样,只是在写的基础上加入了读的模式。
a 追加写 #从文件的末尾处追加写入
log2内容 我是 f1 = open('log2', encoding='utf-8', mode='a') f1.write('\n中国人') #加\n会换行,不加则会直接追加到后面 f1.close() log2内容 我是
中国人
a+
f1 = open('log2', encoding='utf-8', mode='a+') f1.write('fdsafdsafdsagfdg') f1.seek(0) #指针调整到文件开头,否则读取内容为空 print(f1.read()) f1.close()
应用示例
将文件中的所有kobe改为james
业务逻辑
1,打开原文件,产生文件句柄。
2,创建新文件,产生文件句柄。
3,读取原文件,进行修改,写入新文件。
4,将原文件删除。
5,新文件重命名原文件。
代码
import os with open('file_test', encoding='utf-8') as f1,\ open('file_test.bak', encoding='utf-8', mode='w') as f2: for line in f1: new_line = line.replace('kobe','james') f2.write(new_line) os.remove('file_test') os.rename('file_test.bak','file_test')
总结:
文件的操作模式有6种:r、r+、w、w+、a、a+,在上面模式基础上可以实现rb、r+b、wb、w+b、ab、a+b的bytes模式。
实际工作中常用的是r w a,读写同时进行容易出错谨慎使用。图片,视频等文件的操作使用b模式。