文件操作分为读、写、改
一.文件读取(打开文件,r只读模式,默认模式,文件必须存在)
f = open(file='test.txt',mode='r',encoding='utf-8') data = f.read() f.close()
file='test.txt' 表示文件路径
mode='r' 表示只读(可以修改为其他)
encoding='utf-8' 表示将硬盘上的 0101010 按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的 01010101,unicode对照表中有01010101和字符的对应关系。
f.read() 表示读取所有内容,内容是已经转换完毕的字符串。
f.close() 表示关闭文件
PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码。
过程:
1、由应用程序向操作系统发起系统调用open(...)
2、操作系统打开该文件,并返回一个文件句柄给应用程序
3、应用程序将文件句柄赋值给变量f
文件句柄 = open('文件路径', '模式','编码')
f = open("test.txt",'r',encoding="utf-8") for line in f: print(line) f.close()
f = open(file='test.txt',mode='rb') print(f.read().decode('utf8')) f.close()
f = open(file='test.txt',mode='w',encoding='utf-8') f.write('llllll') f.close()
encoding='utf-8' 将要写入的unicode字符串编码成utf-8格式
f.write(...) 表示写入内容,写入的内容是unicode字符串类型,内部会根据encoding转换为制定编码的 01101010101,即:字节类型
文件写入wb,二进制只写模式,不可读,不存在则创建,存在则清空内容
f = open('a.txt','wb') print(f.write('hello'.encode('utf8'))) f.close()
追加:把内容追加到文件尾部(不删除之前内容)
f = open(file='test.txt',mode='a',encoding='utf-8') f.write('llllll') f.close()
三.文件修改
1.将文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存写到硬盘上(例如:word,vim等编辑器)
import os with open('test.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f: data=read_f.read() #全部读入内存,如果文件很大,会很卡 data=data.replace('aaa','bbb’) #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt') os.rename('tmp','a.txt')
import os with open('a.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f: for line in read_f: line=line.replace('aaa','bbb') write_f.write(line) os.remove('a.txt') os.rename('tmp','a.txt')
四.其他
1.使用with
不用关闭文件
with open('test.txt','a',encoding='utf-8') as f: con = f.write('000') print(con)
2.模式总结
文本模式
r,只读模式:默认模式,文件必须存在,不存在则抛出异常
w,只写模式:不可读,不存在则创建,存在则清空内容
a,追加写模式:不可读,不存在则创建,存在则只追加内容
字节模式(对于非文本文件如图片、视频,不用考虑字符编码)
rb,二进制只读模式:默认模式,文件必须存在,不存在则抛出异常
wb,二进制只写模式:不可读,不存在则创建,存在则清空内容
ab,二进制追加写模式:不可读,不存在则创建,存在则只追加内容
读写模式
r+,读写:可读,可写,从文件开头写入
w+,写读:可读,可写,清空后再写
a+,写读:可读,可写,从文件末尾写入
3.操作方法
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中,返回一个list
f.write('1111 222 ') #针对文本模式的写,需要自己写换行符
f.write('1111 222 '.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333 ','444 ']) #文件模式
f.writelines([bytes('333 ',encoding='utf-8'),'444 '.encode('utf-8')]) #b模式
f.flush() #立刻将文件内容从内存刷到硬盘
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
4.光标操作
f.tell() 读取指针的位置
f.seek(0) 设置指针的位置(0回到开头)
truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
read(3) 文件打开方式为文本模式时,代表读取3个字符,文件打开方式为b模式时,代表读取3个字节
seek,tell,truncate光标移动都是以字节为单位
seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
5.不知道文件编码的情况
import chardet f = open('log',mode='rb') data = f.read() f.close() result = chardet.detect(open('log',mode='rb').read()) print(result)
输出:
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
百分之九十九的可能为 GB2312