Python中文件的操作方法
要打开文件,可使用函数open,它位于自动导入的模块io中。函数open将文件名作为唯一必不可少的参数,并返回一个文件对象。如果当前目录中有一个名为somefile.txt的文本文件(可能是使用文本编辑器创建的),则可像下面这样打开它:
f = open('somefile.txt')
open函数的原型是:
my_file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) # 打开文件
... # 读写操作。省略
my_file.colse() # 释放文件
如果要通过写入文本来创建文件,这种调用函数open的方式并不能满足需求。为解决这种问题,可使用函数open的第二个参数。
- 文件模式
调用函数open时,如果只指定文件名,将获得一个可读取的文件对象。如果要写入文件,必须通过指定模式来显式地指出这一点。函数open的参数mode的可能取值有多个,表11-1对此进行了总结。
表11-1 函数open的参数mode的最常见取值
| 值 | 描 述|
| ---- | ---- |
|'r'|读取模式(默认值)|
|'w'|写入模式|
|'x'|独占写入模式|
|'a'|附加模式|
|'b'|二进制模式(与其他模式结合使用)|
|'t'|文本模式(默认值,与其他模式结合使用)|
|'+'|读写模式(与其他模式结合使用)|
请注意,'r+'和'w+'之间有个重要差别:后者截断文件,而前者不会这样做。
- 文件的基本方法
类似于文件的对象支持文件对象的一些方法,如支持read或write,或者两者都支持。urlopen(参见第14章)返回的对象就是典型的类似于文件的对象,它们支持方法read和readline,但不支持方法write和isatty。
在文本和二进制模式下,基本上分别将str和bytes类用作数据。每当调用f.write(string)时,你提供的字符串都将写入到文件中既有内容的后面。
>>> f = open('somefile.txt', 'w')
>>> f.write('Hello, ')
7
>>> f.write('World!')
6
>>> f.close()
请注意,使用完文件后,我调用了方法close,这将在11.2.4节详细介绍。读取也一样简单,只需告诉流你要读取多少个字符(在二进制模式下是多少字节),如下例所示:
>>> f = open('somefile.txt', 'r')
>>> f.read(4)
'Hell'
>>> f.read()
'o, World!'
首先,指定了要读取多少(4)个字符。接下来,读取了文件中余下的全部内容(不指定要读取多少个字符)。请注意,调用open时,原本可以不指定模式,因为其默认值就是'r'。
- 读取和写入行
要读取一行(从当前位置到下一个分行符的文本),可使用方法readline。调用这个方法时,可不提供任何参数(在这种情况下,将读取一行并返回它);也可提供一个非负整数,指定readline最多可读取多少个字符。因此,如果some_file.readline()返回的是'Hello, World!\n',那么some_file.readline(5)返回的将是'Hello'。
要读取文件中的所有行,并以列表的方式返回它们,可使用方法readlines。
为此,可使用方法read并不提供任何参数(将整个文件读取到一个字符串中),也可使用方法readlines(将文件读取到一个字符串列表中,其中每个字符串都是一行)。
方法writelines与readlines相反:接受一个字符串列表(实际上,可以是任何序列或可迭代对象),并将这些字符串都写入到文件(或流)中。请注意,写入时不会添加换行符,因此你必须自行添加。另外,没有方法writeline,因为可以使用write。
使用read迭代字符
with open(filename) as f:
for char in f.read():
process(char)
使用readlines迭代行
with open(filename) as f:
for line in f.readlines():
process(line)
- 关闭文件
通常,程序退出时将自动关闭文件对象(也可能在退出程序前这样做),因此是否将读取的文件关闭并不那么重要。然而,关闭文件没有坏处,在有些操作系统和设置中,还可避免无意义地锁定文件以防修改。另外,这样做还可避免用完系统可能指定的文件打开配额。
对于写入过的文件,一定要将其关闭,因为Python可能缓冲你写入的数据(将数据暂时存储在某个地方,以提高效率)。因此如果程序因某种原因崩溃,数据可能根本不会写入到文件中。安全的做法是,使用完文件后就将其关闭。如果要重置缓冲,让所做的修改反映到磁盘文件中,但又不想关闭文件,可使用方法flush。然而,需要注意的是,根据使用的操作系统和设置,flush可能出于锁定考虑而禁止其他正在运行的程序访问这个文件。只要能够方便地关闭文件,就应将其关闭。
要确保文件得以关闭,可使用一条try/finally语句,并在finally子句中调用close。
# 在这里打开文件
try:
# 将数据写入到文件中
finally:
file.close()
实际上,有一条专门为此设计的语句,那就是with语句。
with open("somefile.txt") as somefile:
do_something(somefile)
with语句让你能够打开文件并将其赋给一个变量(这里是somefile)。在语句体中,你将数据写入文件(还可能做其他事情)。到达该语句末尾时,将自动关闭文件,即便出现异常亦如此。
- 使用文件的基本方法
Welcome to this file
There is nothing here except
This stupid haiku
我们来试试前面介绍过的方法,首先是read(n)。
>>> f = open(r'C:\text\somefile.txt')
>>> f.read(7)
'Welcome'
>>> f.read(4)
' to '
>>> f.close()
接下来是read():
>>> f = open(r'C:\text\somefile.txt')
>>> print(f.read())
Welcome to this file
There is nothing here except
This stupid haiku
>>> f.close()
下面是readline():
>>> f = open(r'C:\text\somefile.txt')
>>> for i in range(3):
print(str(i) + ': ' + f.readline(), end='')
0: Welcome to this file
1: There is nothing here except
2: This stupid haiku
>>> f.close()
最后是readlines():
>>> import pprint
>>> pprint.pprint(open(r'C:\text\somefile.txt').readlines())
['Welcome to this file\n',
'There is nothing here except\n',
'This stupid haiku']
请注意,这里我利用了文件对象将被自动关闭这一事实。下面来尝试写入,首先是
write(string)。
>>> f = open(r'C:\text\somefile.txt', 'w')
>>> f.write('this\nis no\nhaiku')
13
>>> f.close()
运行上述代码后,这个文件包含的文本如代码清单11-4所示。
this
is no
haiku
最后是writelines(list):
>>> f = open(r'C:\text\somefile.txt')
>>> lines = f.readlines()
>>> f.close()
>>> lines[1] = "isn't a\n"
>>> f = open(r'C:\text\somefile.txt', 'w')
>>> f.writelines(lines)
>>> f.close()
运行这些代码后,这个文件包含的文本如代码清单11-5所示。
再次修改后的文本文件
this
isn't a
haiku