掌握了各种操作目录字符串或目录的函数之后,接下来可以准备读写文件了。在进行文件读写之前,首先要打开文件。
Python 提供了一个内置的 open() 函数,该函数用于打开指定文件。
open() 函数的语法格式如下:
open(file_name?[,?access_mode]?[,?buffering])
在上面的语法格式中,只有第一个参数是必需的,该参数代表要打开文件的路径。access_mode 和 bufering 参数都是可选的。
在打开文件之后,就可调用文件对象的属性和方法了。文件对象支持如下常见的属性:
file.closed:该属性返回文件是否己经关闭。
file.mode:该属性返回被打开文件的访问模式。
file.name:该属性返回文件的名称。
如下程序简单示范了如何打开文件和访问被打开文件的属性:
#?以默认方式打开文件 f?=?open('open_test.py') #?访问文件的编码方式 print(f.encoding)?#?cp936 #?访问文件的访问模式 print(f.mode)?#?r #?访问文件是否已经关闭 print(f.closed)?#?False #?访问文件对象打开的文件名 print(f.name)?#?open_test.py
上面程序使用 open() 内置函数打开了 open_test.py 文件,接下来程序访问了被打开文件的各属性。运行上面程序,可以看到如下输出结果:
cp936 r False open_test.py
从上面的输出结果可以看出,open() 函数默认打开文件的模式是“r”,也就是只读模式。下面详细讲解 open() 函数支持的不同模式。
文件打开模式
open() 函数支持的文件打开模式如下图所示
模式 | 意义 |
---|---|
r | 只读模式 |
w | 写模式 |
a | 追加模式 |
+ | 读写模式,可与其他模式结合使用。比如 r+ 代表读写模式,w+ 也代表读写模式 |
b | 二进制模式,可与其他模式结合使用。比如 rb 代表二进制只读模式,rb+ 代表二进制读写模式,ab 代表二进制追加模式 |
可能有读者感到疑惑,w 本身就代表写模式,w+ 还有什么意义呢?
简单来说,w 只是代表写模式,而 w+ 则代表读写模式,但实际上它们的差别并不大。因为不管是 w 还是 w+ 模式,当使用这两种模式打开指定文件时,open() 函数都会立即清空文件内容,实际上都无法读取文件内容。
根据上面的介绍不难看出,如果希望调用 open() 函数打开指定文件后,该文件中的内容能被保留下来,那么程序就不能使用 w 或 w+ 模式。
?
如果程序要读取行,通常只能用文本方式来读取,道理很简单,只有文本文件才有行的概念,二进制文件没有所谓行的概念。
文件对象提供了如下两个方法来读取行:
readline([n]):读取一行内容。如果指定了参数 n,则只读取此行内的 n 个字符。
readlines():读取文件内所有行。
下面程序示范了使用 readline() 方法来读取文件内容:
import?codecs #?指定使用utf-8字符集读取文件内容 f?=?codecs.open("readline_test.py",?'r',?'utf-8',?buffering=True) while?True: ????#?每次读取一行 ????line?=?f.readline() ????#?如果没有读到数据,跳出循环 ????if?not?line:?break ????#?输出line ????print(line,?end='') f.close()
上面程序使用 UTF-8 字符集打开 readline_test.py 文件,这是由于该 Python 源文件是采用 UTF-8 字符集保存的,因此,如果直接用普通的 open() 函数打开文件,则会引发 UnicodeDecodeError 异常。
接下来程序使用 readline() 方法逐行进行读取,当读取到结尾时,该方法将会返回空,程序就会退出循环。
程序也可以使用 readlines() 方法一次读取文件内所有行。例如如下程序:
import?codecs #?指定使用utf-8字符集读取文件内容 f?=?codecs.open("readlines_test.py",?'r',?'utf-8',?buffering=True) #?使用readlines()读取所有行,返回所有行组成的列表 for?1?in?f.readlines(): ????print(1,?end='') f.close()
?