2.2文件处理
- 读、写、修改
- 示例1
-
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r',encoding='utf-8')#表示文件路径 data = f.read() #表示读取所有内容 f.close() #表示文件关闭
PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码 - 示例2
-
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='rb') data = f.read() f.close()
- 示例2和示例1的区别在哪?
- 在于示例2打开文件时并未指定encoding,这是为何?是因为直接以rb模式打开了文件 ,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想内容,还需要手动decode,因此在文件打开阶段,不需要指定编码
- 假如你不知道你要处理的文件是什么编码可怎么办呢?(智能检测编码)
-
import chardet f = open('log',mode='rb') data = f.read() f.close() result = chardet.detect(data) print(result)
- 输出
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''} - 循环文件
f = open("兼职白领学生空姐模特护士联系方式.txt",'r',encoding="utf-8") for line in f: print(line) f.close()
- 写文件
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='w',encoding='utf-8') f.write('北大本科美国留学一次50,微信号:xxxxx') f.close()
- 二进制写入
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='wb') f.write('北大本科美国留学一次50,微信号:xxxxx'.encode('utf-8')) f.close()
- 注意:文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。
- 追加,把内容追加的文件底部。注意:文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容。
f = open("兼职白领学生空姐模特护士联系方式.txt",'a',encoding="gbk") f.write("\n杜姗姗 北京 167 49 13324523342") f.close()
- 读写模式
f = open("兼职白领学生空姐模特护士联系方式.txt",'r+',encoding="gbk") data = f.read() #可以读内容 print(data) f.write("\nblack girl 河北 167 50 13542342233") #可以写 f.close()
- 写读模式。注意:w+会先把文件清空,再写新内容,相比w模式,只是支持了一个读功能,且还只能读已经写入的新内容。(无用的模式)
f = open("兼职白领学生空姐模特护士联系方式.txt",'w+',encoding="gbk") data = f.read() print(data) f.write("\nnewline 1哈哈") f.write("\nnewline 2哈哈") f.write("\nnewline 3哈哈") f.write("\nnewline 4哈哈") print("content",f.read()) f.close()
- 文件操作其他功能
def fileno(self, *args, **kwargs): # real signature unknown 返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到 def flush(self, *args, **kwargs): # real signature unknown 把文件从内存buffer里强制刷新到硬盘 def readable(self, *args, **kwargs): # real signature unknown 判断是否可读 def readline(self, *args, **kwargs): # real signature unknown 只读一行,遇到\r or \n为止 def seek(self, *args, **kwargs): # real signature unknown 把操作文件的光标移到指定位置 *注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。 如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。 但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节 def seekable(self, *args, **kwargs): # real signature unknown 判断文件是否可进行seek操作 def tell(self, *args, **kwargs): # real signature unknown 返回当前文件操作光标位置 def truncate(self, *args, **kwargs): # real signature unknown 按指定长度截断文件 *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。 def writable(self, *args, **kwargs): # real signature unknown 判断文件是否可写
- 修改文件。尝试直接以r+模式打开文件,默认会把新增的内容追加到文件最后面。但我想要的是修改中间的内容 ,怎么办? 为什么会把内容添加到尾部呢?(最新测试r+会从头覆盖,测试代码如下)
import os f_name = "兼职白领学生空姐模特护士联系方式utf8.txt" f_new_name = "%s.new" % f_name old_str = "乔亦菲" new_str = "[乔亦菲 Yifei Qiao]" f = open(f_name,'r',encoding="utf-8") f_new = open(f_new_name,'w',encoding="utf-8") for line in f: if old_str in line: new_line = line.replace(old_str,new_str) else: new_line = line f_new.write(new_line) f.close() f_new.close()
- 上面的代码,会生成一个修改后的新文件 ,原文件不动,若想覆盖原文件
os.rename(f_new_name,f_name) #把新文件名字改成原文件 的名字,就把之前的覆盖掉了,windows使用os.replace # 帮助文档说明replace会覆盖原文件
浙公网安备 33010602011771号