发表于: 2018-01-21 00:28:35
1 1084
今天完成的事情:学习open()打开文件进行读写操作
这两天主要学习了 Python 中文件操作的相关知识,现将相关内容记录整理成此日报,方便今后使用时注意。
1、文件基本操作
Python中打开文件超级简单,不用导入任何包,直接输入:
f = open('your_file.txt')
data = f.read()
f.close()
基本步骤:先打开文件,再读取文件内容(或写进内容),最后关闭文件。
但在具体使用过程中,发现这里面有许多坑,很容易对初学者造成困惑,需要格外小心,现将遇到的问题整理如下。
2、遇到的问题
(1)文件的路径问题
如果文件不在当前脚本目录下,则需要包含了具体路径,如:
f = open("D:\PycharmProjects\PyCode\Test.access.20180120.log")
结果运行后系统报错。排查问题后,发现是问题出在斜杠(“\”)上。Windows系统文件路径中的斜线符号为“\”,而Python中将“\”当作转义符。上述文件路径经过转义处理后找不到文件路径,系统报错。
解决办法一:将“\”换成“/”,如下
f = open("D:/PycharmProjects/PyCode/Test.access.20180120.log")
解决办法二:将“\”换成“\\”,如下
f = open("D:\\PycharmProjects\\PyCode\\Test.access.20180120.log")
解决办法三:在含有转义符的字符串前加“r”,表示字符串内按原含义解释,不作转义处理,如下
f = open(r"D:\PycharmProjects\PyCode\Test.access.20180120.log")
上述三种解决办法中,一般优先推荐第三种写法。
(2)文件的打开方式
在open()函数中,根据文件操作的性质需要,有时需要指定第二个参数 mode,即为文件的打开方式,如下
f = open(r"D:\PycharmProjects\PyCode\Test.access.20180121.log", "r")
参数 mode 默认为空时表示只读方式 ,具体取值如下:
- r 以只读方式打开文件。文件指针将会放在文件的开头。这是默认模式。
- r+ 打开文件用于读写。文件指针将会放在文件的开头。
- w 打开文件只用于写入。如果文件已存在则将其覆盖。文件不存在时创建新文件。
- w+ 打开文件用于读写。如果文件已存在则将其覆盖。文件不存在时创建新文件。
- a 打开文件用于追加。如果文件已存在,文件指针将会放在文件的结尾。文件不存在时创建新文件。
- a+ 打开文件用于追加读写。如果文件已存在,文件指针将会放在文件的结尾。文件不存在时创建新文件。
- rb 以二进制格式打开文件用于只读。文件指针将会放在文件的开头(如图像文件)。
- rb+ 以二进制格式打开文件用于读写。文件指针将会放在文件的开头。
- wb 以二进制格式打开文件只用于写入。如果文件已存在则将其覆盖。文件不存在时创建新文件。
- wb+ 以二进制格式打开文件用于读写。如果文件已存在则将其覆盖。文件不存在时创建新文件。
- ab 以二进制格式打开文件用于追加。如果文件已存在,文件指针将会放在文件的结尾。文件不存在时创建新文件。
- ab+ 以二进制格式打开文件用于追加读写。如果文件已存在,文件指针将会放在文件的结尾。文件不存在时创建新文件。
- 注意:请不要用二进制方式打开文本文件,否则会有许多莫名的控制字符出现。
(3)文件的编码方式
打开文件时,如果默认情况下不指定文件编码格式,那么当文件编码格式与当前默认的编码格式不一致时,文件内容的读写将会出现错误。
解决办法:在open()函数中,需要指定 encoding 参数,即文件编码格式,如下
f = open(r"D:\PycharmProjects\PyCode\Test.access.20180121.log", "w", encoding="utf-8")
需要注意的是:这种方式好像只适用于Python3.x。至于Python2.x,可能需要使用其他方式解决。因本人的Python环境只有3.6.4版本,2.x版本没有进行测试。
(4)文件对象的操作
f.read() 读取全部数据,返回字符串对象
f.readline() 逐行读取数据,返回字符串对象
f.next() 逐行读取数据,和readline不同的是,readline读取到最后如果没有数据会返回空,而next没读取到数据则会报错
f.readlines() 读取全部数据,返回列表(list)对象
f.write() 将任何字符串写入,包括二进制数据,不仅仅是文本数据,无返回值
f.writelines() 多行写入,如果需要换行则需要自己加入换行符
f.flush() 将修改写入到文件中(无需关闭文件)
f.tell() 获取当前文件指针位置
f.close() 关闭文件,关闭后不能再进行读写操作
f.seek(偏移量,选项) 根据偏移量和选项值来移动文件指针到相应位置。
偏移量:正数表示向右偏移,负数表示向左偏移
(1)选项=0,表示将文件指针指向从文件头部到“偏移量”字节处
(2)选项=1,表示将文件指针指向从文件的当前位置,向后移动“偏移量”字节
(3)选项=2,表示将文件指针指向从文件的尾部,向前移动“偏移量”字节
(5)文件的关闭
一般在打开文件操作处理后,最后需要手动关闭文件,特别是在进行写操作后,修改的内容其实还在缓冲区内,还没有真正保存到文件中,如果不进行f.flush() 或 f.close() 操作,则修改的内容将会丢失。
(6)代码的健壮性
第一,对于文件的操作,由于各种不可预料的因素,系统报错时有发生,也就是会有异常抛出,考虑到程序代码的健壮性,这时需要进行异常处理。一般的异常处理模式为 “try ...... except ....... finally”,即如下代码:
try:
try:
f = open("your_file.txt")
data = f.read()
except IOError:
print("no data read")
finally:
f.close()
或者:
try:
try:
f = open("your_file.txt")
data = f.read()
finally:
f.close()
except IOError:
print("no data read")
在 Python 中还提供了另一种异常处理的办法,即推荐使用 with 语句,代码更紧凑、更优雅,代码格式如下:
with open("your_file.txt") as f:
data = f.read()
使用with语句,Python还会自动帮我们调用close(),不需要我们手动关闭文件了,真是爽哇哇啦。
第二,上述调用 f.read() 方法会一次性读取全部文件的内容,如果文件大小为10G,则内存就爆了。所以,为了保险起见,可以反复调用 f.read(size)
方法,每次最多读取 size 个字节的内容。或者调用 readline() ,可以每次读取一行内容。以下代码可以借鉴:
with open("your_file.txt") as f:
for line in f:
print(line)
评论