- Q:文件在硬盘是如何存储?
- 以某种编码格式的“010101”保存在硬盘上,比如,如果是以utf-8格式写入的“你好”,则保存在硬盘上的是utf-8编码对应的二进制,是3个字节,如果以gbk格式写入的“你好”,则保存的是gbk编码对应的二进制,是2个字节
- python的文件操作分为读、写、修改
-
1.读文件
-
示例1:以指定编码形式读文件,‘r+encoding'
f = open(file="a.txt",mode='r',encoding="utf-8") #file:文件名,如果文件在同一个工程目录下,可不指定路径,否则,需指定,mode:‘r’表示只读(可修改为其他模式) #encoding="utf-8":将硬盘存入的01以utf-8的编码规则去“断句”,再将“断句”后的utf-8转换成unicode的01,unicode中有01和字符的对应关系 data = f.read()#读取文件所有内容,内容是已经转换完毕的字符串 data2 = f.read()#读取文件所有内容,内容是已经转换完毕的字符串 print(data) print("------data2------") print(data2) f.close()#关闭文件
结果解析:第一次f.read后,光标已经到文本最后了,不会自动返回首行,因此,第二次在读的时候是没有数据的
-
你好,中国 你好,世界 ------data2------
- 示例2:以二进制模式读文件,'rb‘’
-
f = open(file="a.txt",mode='rb')#rb:只读,以二进制格式读取,读取内容是硬盘上原来以某种编码格式保存的01,即某种编码格式的字节类型,不需指定encoding data = f.read() print(data) f.close()
b'xe4xbdxa0xe5xa5xbdxefxbcx8cxe4xb8xadxe5x9bxbd xe4xbdxa0xe5xa5xbdxefxbcx8cxe4xb8x96xe7x95x8c'
- Q:假如你不知道你要处理的文件是什么编码可怎么办呢?
- A:import chardet
-
import chardet f = open("a.txt","rb") data = f.read() f.close() result = chardet.detect(data) print(result)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
-
循环输出文件
-
f = open("a.txt","r",encoding='utf-8') for line in f: print(line) f.close()
你好,中国 你好,世界 Process finished with exit code 0
每行之间多出的空行是因为print输出时,自带空行
-
-
2.写文件,如果文件不存在,则先创建一个文件
- 示例1:以指定编码形式写文件:'w+encoding'
-
f = open("a.txt","w",encoding='utf-8')#w:只写,encoding='utf-8',将要写入的unicode字符串编码成utf-8格式 f.write('Hello world')#表示写入内容,写入的内容是unicode字符串类型,内部会根据encoding转换为指定编码的01,即字节类型 f.close()
- 示例2:以二进制形式写文件,‘wb’
-
f = open("a.txt","wb")#wb:只以二进制格式写 f.write('Hello world'.encode('utf-8'))#写入内容,写入的内容必须是字节类型,也就是某种编码格式的二进制 f.close()
- 1和2的区分及注意事项
- 文件操作时,以‘w’和‘wb’模式打开,则只能写,并且在打开的同时会先将文件原有的内容清空
- 写入到硬盘时,必须是某种编码格式的01,打开时需注意:
- wb:写入时需要直接传入以某种编码的01,即字节类型
- w和encoding:写入时需要传入unicode字符串,内部会根据encoding指定的编码将unicode字符串转换为该编码的01
- 追加:把内容追加到文件尾部 'a' 'ab'
-
f = open("a.txt","a",encoding='utf-8')# f.write(' Hello world')# f.close()
f = open("a.txt","ab")# f.write(' Hello world'.encode('utf-8'))# f.close()
-
3.读写模式:'r+',写的内容追加到了文本的最后面
-
f = open("a.txt","r+",encoding='utf-8')# print(f.read()) f.write(' Hello world')# f.close()
-
4.写读模式:‘w+’,会先把文件的内容清空,再写新的内容,相比w模式,只是支持一个读功能,且还只能读已经写入的新内容,没有太大用途