*Python3的默认编码是utf8,而其中的open函数打开文件时依托于系统编码(windows编码时gbk)
这里面比较经典的问题就是解码与编码的码不一致,导致乱码的问题 *文件操作的基本流程: 1.f=open('文件路径',encoding='编码') 注意:文件的编码要与打开文件时的解码一致 2.data=f.read() 3.print(data) 4.f.close() *文件的操作模式: 注意:读写的文件内容必须都是字符串。write或是read参数都是字符串,writelines或是readlines参数都是list 1.r:只读 open()函数默认就是只读的。 (r+ 读写都可以) 读文件: f=open('文件路径','r’,encoding='编码') f.readable() 如果对象是只读的,则返回True,否则返回False f.readline() 按行读取文件中的数据。 例:f=open('b.txt') data1=f.readline() data2=f.readline() print(data1,end='') #如果不加end,默认打印数据之间是有换行符的。 print(data2) 注意:如果使用f.read()读取文件的全部内容了,这是光标会自动到文件内容的末尾,所以在使用 f.readline()就不会在读取出数据了。 f.readlines():读取多行,默认返回列表,每一行数据包括换行符作为列表中的一个元素 2.w:只写(w+读写都可以) 写文件: f=open('文件路径','w’,encoding='编'码):如果文件不存在,则创建一个空的文件;如果存在,则清空原文件内容 f.write('文件内容\n') 如果不手动添加换行符,默认是不会换行的 f.writeable():如果对象是只写的,则返回True,否则返回False f.writelines(list):写多行,列表中元素的个数代表写几行内容,前提是每个元素里面结尾必须加上换行符 3.a:只追加(写)[a+ 可读写] f=open('文件路径','a’,encoding='编'码):如果文件不存在,则创建一个空的文件;如果存在,则保留原文件内容 f.write()/f.writelines()会把数据追加到文件中数据末尾 4.with open(...) as f: ... 本方法操作文件不需要手动调用close方法,其本身会自动调用,这就是这个方式操作文件的优势 with open() as f1,open() as f2: ... 打开多个文件
5.注意:把文件中的内容存到硬盘上,即实现str编码成byte的形式,从硬盘上读取str,即实现byte解码成str的操作
*b是操作字节文件 .rb模式 f=open(file,'rb') 注意:这里面是从硬盘上直接读取字节文件,不需要编码,即没有encoding这个参数 print(f.read()) :打印的内容都是字节对象(包括\r\n换行符),如果想打印字符串即原文件具体内容,可以data.decode() 注意:解码与编码的码一致 . wb模式 f=open(file,'wb') 方式一:f.write(bytes(filecontent,encoding)) 注意:必须指定编码encoding,因为文件存到硬盘上,必须编码(str-->byte) 方式二:f.write(str.encode(编码)) .ab模式 注意:为什么使用b模式? *b模式可以打开多种类型文件(文件默认打开的是文本类型,即便你指定'r’的方式打开文件,其默认也会变成'rt’, w与a同上;如果操作非文本类型就要使用b模式) *b模式跨平台 *b模式对于linux操作系统没用。因为linux默认打开文件就是b模式的
6.文件操作的其他方法:
* f=open(file,'r',encoding='gbk') print(f.encoding)#该方法获取的是encoding的参数值(文件的解码的码值,并非文件编码码值) * f=open(file,'w',encoding='gbk') f.write('I love China!') f.flush() PyCharm中,会默认调用该方法,把内容写到文件中,在cmd中,需要手动调用flush()方法 *f.tell():返回值是光标所在的位置(光标移动是以字节为单位的) 注意:windows下的换行符是\r\n,不同系统的换行符在PyCharm中都会被转换成\n,但是只是形式发生变化,其字节数并未变 还要注意文件编码的中文问题,中文在utf8中占用3个字节,gbk中占用2个字节 例:f=open('a.txt','r+',encoding='utf-8',newline='') print(f.readlines()) 如果open函数不加newlines参数,打印的内容是['...\n','...\n',...],加上参数之后,打印内容是['...\r\n',...] *f.seek(int):从文件头开始移动光标到int的位置(字节) 1.f=open(file,'r+',encoding='gbk') f.seek(int,0):第二个参数是0,是该方法的默认值,即从文件头开始移动光标 2.f=open(file,'rb+') f.seek(int,1):第二个参数是1,表示从相对位置移动光标,所谓的相对位置即上一次seek的位置 3.f=open(file,'rb+') f.seek(int,2):从文件内容的末尾倒着读int个字符,注意int必须是负数才可以,若是正数不报错,但是处理不多。 注意:seek方法除了默认的模式0之外,其他的文件打开方式必须是b模式,否则报错 *f.read(int):从光标位置读取int个字符 *f.truncate(int):从文件头发开始截取文件内容(字节为单位,注意中文问题) *循环文件: 方式一: f=open(file,'rb') for item in f.readlines():浪费内存,因为文件中的内容已经全部读取出来放到list中了 print(i) 方式二: f=open(file,'rb') for item in f:按行读取文件内容,只是在需要的时候才会读取,不会以一下子全部拿出来 offs=10 #偏移量 while True: f.seek(offs,2) li=f.readlines() if len(li)>1 : print(data[-1].decode('utf-8'))#这里面的解码与你该文件的编码一致,不一定是utf-8 break; offs*=2 方式二是读取大型文件的最后一行操作。常见于面试题 |
|