文件内建函数open()和 file()
作为打开文件之门的"钥匙", 内建函数 open() [以及 file() ]提供了初始化输入/输出(I/O)
操作的通用接口. open() 内建函数成功打开文件后时候会返回一个文件对象, 否则引发一个错误.
当操作失败, Python 会产生一个 IOError 异常 - 我们会在下一章讨论错误和异常的处理. 内建函
数 open() 的基本语法是:
file_object = open(file_name, access_mode=‘r‘, buffering=-1)
file_name 是包含要打开的文件名字的字符串, 它可以是相对路径或者绝对路径. 可选变量
access_mode 也是一个字符串, 代表文件打开的模式. 通常, 文件使用模式 ‘r‘, ‘w‘, 或是 ‘a‘
模式来打开, 分别代表读取, 写入和追加. 还有个 ‘U‘ 模式, 代表通用换行符支持(见下).
使用 ‘r‘ 或 ‘U‘ 模式打开的文件必须是已经存在的. 使用 ‘w‘ 模式打开的文件若存在则首
先清空, 然后(重新)创建. 以 ‘a‘ 模式打开的文件是为追加数据作准备的, 所有写入的数据都将
追加到文件的末尾. 即使你 seek 到了其它的地方. 如果文件不存在, 将被自动创建, 类似以 ‘w‘
模式打开文件. 如果你是一个 C 程序员, 就会发现这些也是 C 库函数 fopen() 中使用的模式.
其它 fopen() 支持的模式也可以工作在 Python 的 open() 下. 包括 ‘+‘ 代表可读可写, ‘b‘
代表二进制模式访问. 关于 ‘b‘ 有一点需要说明, 对于所有 POSIX 兼容的 Unix 系统(包括
Linux)来说, ‘b‘是可由可无的, 因为它们把所有的文件当作二进制文件, 包括文本文件. 下面是
从 Linux 手册的 fopen() 函数使用中摘录的一段, Python 语言中的 open() 函数就是从它衍生
出的:
指示文件打开模式的字符串中也可以包含字符 "b" , 但它不能做为第一个字符出现.这样做的
目的是为了严格地满足 ANSI C3.159-1989 (即 ANSI C)中的规定; 事实上它没有任何效果, 所有
POSIX 兼容系统, 包括 Linux , 都会忽略 "b" (其它系统可能会区分文本文件和二进制文件, 如果
你要处理一个二进制文件, 并希望你的程序可以移植到其它非 Unix 的环境中, 加上"b" 会是不错的
主意)。
你可以在表 9.1 中找到关于文件访问模式的详细列表, 包括 ‘b‘ 的使用 - 如果你选择使用
它的话. 如果没有给定 access_mode , 它将自动采用默认值 ‘r‘ .
另外一个可选参数 buffering 用于指示访问文件所采用的缓冲方式. 其中 0 表示不缓冲, 1
表示只缓冲一行数据, 任何其它大于 1 的值代表使用给定值作为缓冲区大小. 不提供该参数或者
给定负值代表使用系统默认缓冲机制, 既对任何类电报机( tty )设备使用行缓冲, 其它设备使用正
常缓冲. 一般情况下使用系统默认方式即可.
表 9.1 文件对象的访问模式
文件模式 操作
r 以读方式打开
rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
w 以写方式打开 (必要时清空)
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
a. Python 2.3 中新增
这里是一些打开文件的例子:
fp = open(‘/etc/motd‘) # 以读方式打开
fp = open(‘test‘, ‘w‘) # 以写方式打开
fp = open(‘data‘, ‘r+‘) # 以读写方式打开
fp = open(r‘c:\io.sys‘, ‘rb‘) # 以二进制读模式打开
9.2.1
工厂函数 file()
在 Python 2.2 中,类型和类被统一了起来,这时,加入了内建函数 file(). 当时, 很多的内
建类型没有对应的内建函数来创建对象的实例。例如 dict(), bool(), file(), 等等, 然而,另一
些却有对应的内建函数, 例如 list(), str(), 等等.
open() 和 file() 函数具有相同的功能, 可以任意替换.
您所看到任何使用 open() 的地方, 都可以使用 file() 替换它.
可以预见, 在 将来的 Python 版本中, open() 和 file() 函数会同时存在, 完成相同的功能.
一般说来, 我们建议使用 open() 来读写文件, 在您想说明您在处理文件对象时使用 file() , 例
如 if instance(f, file)