python文件处理
目录
1、文件打开模式的含义列表
2、文件处理(读、写、追加、修改、删除)
1、文件打开模式的含义列表
| 模式 | 含义 |
|---|---|
| r | 文本只读模式 |
| rb | 二进制模式 这种方法是用来传输或存储,不给人看的 |
| r+ | 读写模式,只要有r,那么文件必须存在 |
| rb+ | 二进制读写模式 |
| w | 只写模式,不能读,用w模式打开一个已经存在的文件,如果有内容会清空,重新写 |
| wb | 以二进制方式打开,只能写文件,如果不存在,则创建 |
| w+ | 读写模式,先读后写,只要有w,会清空原来的文件内容 |
| wb+ | 二进制写读模式 |
| a | 追加模式,也能写,在文件的末尾添加内容 |
| ab | 二进制追加模式 |
| a+ | 追加模式,如果文件不存在,则创建文件,如果存在,则在末尾追加 |
| ab+ | 追读写二进制模式,从文件顶部读取文件,从文件底部添加内容,不存在则创建 |
2、文件处理(读、写、追加、修改、删除)
读文件:
f = open('E:\python\python第三章\staff_table.txt',mode='r',encoding='utf-8')
# 'E:\python\python第三章\staff_table.txt' 表示文件路径
# mode='r' 表示只读(可以修改其他(r))
# encoding='utf-8' 表示将硬盘上的 0101010按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的 01010101,unicode对照表中有01010101和字符的对应关系。d = f.read() # 表示读取所有内容,内容是已经转换完毕的字符串。print(d)
f.close() # 表示关闭文件
问题:假如读取的时候不知道处理的文件是何种编码怎么办呢?
首先我们需要导入一个工具chardet(字符编码判断)
看代码:
import chardet f = open('user.txt',mode='rb') data = f.read()
f.close() print(chardet.detect(data))
# 输出
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
注意:
1) 文件操作时,以 “r”或“rb” 模式打开,则只能读,无法写入;
2) 硬盘上保存的文件都是某种编码的0101010,打开时需要注意:
3) rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示
4) r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句,再将“断句”后的每一段0101010转换成unicode的 010101010101,在Python中用字符串类型表示
问题:如果文件特别大,内存又特别小;打开文件,就会撑爆内存,运行速度相当慢!用什么办法解决?
用循环文件;看代码:
1 f = open('user.txt','r',encoding='utf-8') 2 for line in f: 3 print(line) 4 f.close() 5 # 即!一行一行的读
写文件:
1 f = open('user.txt','w',encoding='utf-8') # w表示写 2 f.write('奔跑后自由') 3 f.close()
二进制写法:
1 f = open('user.txt','wb') # wb 表示只以二进制的方式写进去 2 f.write('奔跑后自由'.encode('gbk')) # 表示写入内容,写入时必须指定字符编码! 3 f.close()
注意:
注意:
1) 文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。
2) 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
3) wb,写入时需要直接传入以某种编码的0100101,即:字节类型
4) w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010
问题:w+和r+有什么区别?
答:w+是文件存在清空内容,然后写入:若文件不存在则创建文件。
r+是以可读写方式打开,文件必须存在。
追加
1 f = open('user.txt','ab') 2 f.write('\n会心一笑'.encode('gbk')) 3 f.close()
注意
1) 文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容
2) 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
3) ab,写入时需要直接传入以某种编码的0100101,即:字节类型
a) 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010
修改文件
问题:追加只能追加在尾部,那如果我想修改任意位置的文件呢?

先看导图,然后看代码:
# 占硬盘的方式来修改
1 import os 2 f_name = "E:\python\python第三章\Write.txt" 3 f_new_name = "%s.name"%f_name 4 str = "有人25岁就当上CEO,却在50岁去世。" 5 new_str = "有人25岁就当爸,然在30岁做了CEO" 6 f = open(f_name,'r',encoding='UTF-8') 7 f_new = open(f_new_name,'w',encoding='UTF-8') 8 for line in f: 9 if str in line: 10 new_line = line.replace(str,new_str) 11 else: 12 new_line = line 13 f_new.write(new_line) 14 f.close() 15 f_new.close() 16 os.replace(f_new_name,f_name)
1 # 占内存的方法修改文件 2 f = open('E:\python\python第三章\Write.txt','r+',encoding='utf-8') 3 data = f.read() 4 str = '有人25岁就当上CEO,却在50岁去世。' 5 new_str = '有人25岁就当爸,然在30岁做CEO' 6 new_data = data.replace(str,new_str) 7 f.seek(0) 8 f.truncate() 9 f.write(new_data) 10 f.close()
删除文件
1 with open('E:\python\python第三章\Write.txt','r',encoding='utf-8') as f: 2 f1 = f.readlines() 3 with open('E:\python\python第三章\Write.txt','w',encoding='utf-8')as f_w: 4 for line in f1: 5 if '也有人50岁才当上CEO,然后活到90岁。' in line: 6 continue 7 f_w.write(line)
问题:区别readlines和readline、read
read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
readline() 只读一行,遇到\r or \n为止
readines() 读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。

浙公网安备 33010602011771号