文件处理分为 读、写、修改
-
读文件
PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码。
示例1:指定编码读文件
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: 二进制模式读文件
f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='rb')
data = f.read()
f.close()
#file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt' 表示文件路径
#mode='rb' 表示只读(可以修改为其他)
#f.read() 表示读取所有内容,内容是硬盘上原来以某种编码保存的 010101010,即:某种编码格式的字节类型
#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(open('log',mode='rb').read()) print(result) #输出: {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'} ''' chardet 模块 根据编码的特征、规律. 第三方模块,需要安装 '''
注意:
- 文件操作时,以 “r”或“rb” 模式打开,则只能读,无法写入;
- 硬盘上保存的文件都是某种编码的0101010,打开时需要注意:
- rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示
- r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句,再将“断句”后的每一段0101010转换成unicode的 010101010101,在Python中用字符串类型表示
循环文件
防止文件过大,占满内存。循环处理文件,边读边处理
f = open("兼职白领学生空姐模特护士联系方式.txt",'r',encoding="utf-8")
for line in f:
print(line)
f.close()