正确的python文件读的方法_Python文件读取的3种方法及路径转义_weixin_39552472的博客-CSDN博客
本文简述python如何读文件、写文件 ,如何注意字符编码问题、如何避免文件路径转义
目录
一. 读文件
以读文件的模式打开一个文件对象,使用python内置的函数open(),传入文件名和标识符:
f=open('E:\python\test.txt','r')
打开文件后,python调用read()方法一次读取文件全部内容到内存,用str对象表示:
f.read() # 输出'hello,python!'
最后调用close()方法关闭文件:
f.close()
注:文件使用完毕后必须关闭,否则文件对象会继续占用操作系统的资源,并且操作系统同一时间能打开的文件数量是有限的。
改进1. try....finally
文件不存在时,open()会抛出IOError错误,一旦出错,后面的f.close()就不被调用,也就无法保证能正确关闭文件。
try:
f = open('/path/', 'r')
print(f.read())
finally:
if f:
f.close()
改进2. with...as
python引入with语句自动调用close(),代码更简洁,且不用写f.close()方法
with open('/path/','r') as f:
print(f.read())
改进3. read(size) / readline() / readlines()
调用read()会一次性读取文件的全部内容,如果文件有20G,内存直接就爆了
read() # 文件很小,一次性读取更方便
read(size) # 反复调用,每次最多读取size个字节的内容
readline() # 每次读取一行内容
readlines() # 一次读取所用内容并按行返回list
二、写文件
与读文件类似,调用open()函数,传入标识符'w'或'wb',写入文本文件或二进制文件:
with open('E:/python/test.txt', 'w') as f:
f.write('Hello, Python!')
三、字符编码问题
# 读取非utf-8编码的文本文件,需要给open()函数传入encoding参数,eg:读取gbk编码的文件:
open('E:/python/gbk.txt', 'r', encoding='gbk')
# 有些文件编码不规范,出现UnicodeDecodeError,是因为文本文件中夹杂了一些非法编码的字符。此时,最简单的方法是直接忽略,设置open()函数的errors参数
open('E:/python/gbk.txt', 'r', encoding='gbk', errors='ignore')
如果 Python 解释器提示UnicodeDecodeError
异常,其原因在于,目标文件使用的编码格式和 open() 函数打开该文件时使用的编码格式不匹配。
解法1.
将 open() 函数中的 encoding 参数值修改为和目标文件相同的编码格式(utf-8或者gbk);
解法2.
重新生成目标文件(即将该文件的编码格式改为和 open() 函数中的 encoding 参数相同);
解法3.
先使用二进制模式读取文件,然后调用 bytes 的 decode() 方法,使用目标文件的编码格式,将读取到的字节串转换成认识的字符串。
#以二进制形式打开指定文件,该文件编码格式为 utf-8
f = open("my_file.txt",'rb+')
byt = f.read()
print(byt)
print("\n转换后:")
print(byt.decode('utf-8'))
f.close()
# 程序执行结果为:
b'Python\xe6\x95\x99\xe7\xa8\x8b\r\nhttp://c.biancheng.net/python/'
转换后:
Python教程
http://c.biancheng.net/python/
四、转义问题
open('g:\test.txt', 'r') # 报错:IOError:invalid mode('r') or filename
出错是因为路径被转义了
改错1:用 '/' 替换 '\'
f = open('g:/test.txt','r')
改错2:加上 r'path'
f = open(r'g:\test.txt', 'r')
转义示例:
f = 'g:\\test.txt' # 'g:\\test.txt' 未被转义
f = r'g:\test.txt' # 'g:\\test.txt' 未被转义
'g:\a.txt' # 'g:\x07.txt' 被转义
'g:\\a.txt' # 'g:\\a.txt' 未被转义