- 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'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\xad\xe5\x9b\xbd\r\n\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c'
- 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('\nHello world')#
f.close()f = open("a.txt","ab")#
f.write('\nHello world'.encode('utf-8'))#
f.close()
3.读写模式:'r+',写的内容追加到了文本的最后面
f = open("a.txt","r+",encoding='utf-8')#
print(f.read())
f.write('\nHello world')#
f.close()
4.写读模式:‘w+’,会先把文件的内容清空,再写新的内容,相比w模式,只是支持一个读功能,且还只能读已经写入的新内容,没有太大用途