1.文件类型:文本文件和二进制文件
硬盘中的文件保存为01010101格式,一般读取文件是把文件从硬盘中读取到内存中。
- 文本文件需要进行格式转换才能读取出来。
- 二进制文件一般用于传输
二进制文件:视频图片
2.文件打开模式
几种不同的读取和遍历文件的方法比较:如果文件很小,read()一次性读取最方便;
如果不能确定文件大小,反复调用read(size)比较保险;
如果是配置文件,调用readlines()最方便。
普通情况,使用for循环更好,速度更快。
3.r rb读模式
(1)r 读模式
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r',encoding='utf-8') data = f.read() f.close()
file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt' 表示文件路径 mode='r' 表示只读(可以修改为其他) encoding='utf-8' 表示将硬盘上的 0101010 按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的 01010101,unicode对照表中有01010101和字符的对应关系。 f.read() 表示读取所有内容,内容是已经转换完毕的字符串。 f.close() 表示关闭文件
PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码。
(2)rb 二进制读模式
二进制模式,通常用来读取图片、视频等二进制文件。
注意,它在读写的时候是以bytes类型读写的,因此获得的是一个bytes对象而不是字符串。在这个读写过程中,需要自己指定编码格式。在使用带b的模式时一定要注意传入的数据类型,确保为bytes类型。
(3)智能检测编码工具:chardet
# 安装包 C:\Users\liangshuo>pip install chardet# 代码 import chardet f = open('file_2_gbk.txt',mode='rb' ) data = f.read() result = chardet.detect(data) print(result)# {'confidence': 1.0, 'encoding': 'ascii', 'language': ''}
(4)编码问题
注意:文件操作时,以 “r”或“rb” 模式打开,则只能读,无法写入;
硬盘上保存的文件都是某种编码的0101010,打开时需要注意:
rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示
r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句,再将“断句”后的每一段0101010转换成unicode的 010101010101,在Python中用字符串类型表示
4.w wb写模式
(1)w模式
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='w',encoding='utf-8') f.write('北大本科美国留学一次50,微信号:xxxxx') f.close()
file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt' 表示文件路径 mode='w' 表示只写 encoding='utf-8' 将要写入的unicode字符串编码成utf-8格式 f.write(...) 表示写入内容,写入的内容是unicode字符串类型,内部会根据encoding转换为制定编码的 01101010101,即:字节类型
(2)wb模式
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='wb') f.write('北大本科美国留学一次50,微信号:xxxxx'.encode('utf-8')) f.close()
file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt' 表示文件路径 mode='wb' 表示只以2进制模式写 f.write(...) 表示写入内容,写入的内容必须字节类型,即:是某种编码格式的0101010
(3)编码问题
注意:文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:wb,写入时需要直接传入以某种编码的0100101,即:字节类型
w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010
5.a ab追加模式
f = open("兼职白领学生空姐模特护士联系方式.txt",'a',encoding="gbk")f.write("\n杜姗姗 北京 167 49 13324523342") f.close()# 姓名 地区 身高 体重 电话 况咏蜜 北京 171 48 13651054608 ...... 岳妮妮 深圳 177 54 18835324553 贺婉萱 深圳 174 52 18933434452 叶梓萱 上海 171 49 18042432324 杜姗姗 北京 167 49 13324523342 #这行是添加的
文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:ab,写入时需要直接传入以某种编码的0100101,即:字节类型
a 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010
6.混合模式r+ w+
(1)r+ 读写模式
f = open('file_2_gbk.txt',mode='r+' ) data = f.read() # 读内容 print(data) f.write('\nthis is last') #写内容 f.close()
(2)w+写读模式(没用)
w+会先把文件清空,再写新内容,
相比w模式,只是支持了一个读功能,且还只能读已经写入的新内容。着实没什么卵用。。。
7. with关键字
with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。注意缩进。
with open('test.txt', 'w') as f:f.write('Hello, world!')
with支持同时打开多个文件:
with open('log1') as obj1, open('log2','w') as obj2:s=obj1.read()obj2.write(s)
8.遍历文件
实际上,更多的时候,我们将文件对象作为一个迭代器来使用。
f = open('file_2_gbk.txt',mode='r' ) for line in f:print(line,end='') f.close()# 111111111 22222222 33333333 4444444
这个方法很简单, 不需要将文件一次性读出,但是同样没有提供一个很好的控制,与readline方法一样只能前进,不能回退。