发表于: 2018-01-21 00:28:35

1 923


今天完成的事情:学习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)




返回列表 返回列表
评论

    分享到