目录
一、示例
二、语法
一、示例
假设在 Python3 所在当前工作目录下创建了一个文件 test.txt,其内容如下:
First Line
Last Line
要读取该文件,通常使用内置函数 open(),例如:
>>> fin = open('test.txt')
>>> for words in fin:
print(words)
First Line
Last Line
>>> fin.close()
注意,使用 open() 方法且处理完后,好的习惯是 确保关闭文件对象,即在处理完毕后调用 close() 方法。
二、语法
内置函数 open() 的完整语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数 | 含义 |
file | 文件路径 (相对路径/绝对路径) (必选参数) |
mode | 文件打开模式 (可选参数) |
buffering | 设置缓冲策略 |
encoding | 指定编码名称 (只用于文本模式且常用utf-8) |
errors | 指定如何处理编解码错误 (只用于文本模式) |
newline | 控制是否区分换行符 |
closefd | 传入的 file 参数类型 |
opener | 使用自定义开启器 |
open() 用于打开一个文件,并返回相应的 文件对象 (file object)。若无法打开该文件,则会抛出 OSError。虽然 open() 的语法格式看起来很复杂,但通常仅用到两个参数,即:
open(file, mode='r')
file 是一个路径类对象 (path-like object),代表一个文件系统路径的对象。既可以是一个表示路径的 str 或 bytes 对象,也可以是一个实现了 os.PathLike 协议的对象 (支持 os.PathLike 协议的对象可通过调用 os.fspath() 函数转换为 str 或 bytes 类型的文件系统路径)。实际上,file 通常表示 将打开文件的路径 (绝对路径或当前工作目录的相对路径) 或 其他。
mode 是一个可选 str,用于指定文件打开模式。mode 的默认值为 'r' (同 'rt'),表示默认以文本模式下的 只读 (read only) 方式打开文件 (且文件的指针将置于文件开头)。常见的 mode 有:
模式 | 含义 | 相关单词 |
'r' | 只读(默认) | read |
'w' | 写入(并先截断已经存在的文件) | write |
'x' | 排它性创建(若文件已存在则报错) | exclusive |
'a' | 追加写入(若文件已存在则在末尾追加) | append |
'b' | 二进制模式 | byte |
't' | 文本模式(默认) | text |
'+' | 更新磁盘文件(可读写) | update |
注意 写入('w') 和 追加('a') 的区别:
- mode='w' 表示打开一个文件只用于写入,若参数 file 指定文件已存在则打开之,并从头开始写入 (文件指针将置于文件开头),即原有内容会被覆盖;若参数 file 指定文件不存在,则创建新文件并写入 (文件指针将置于文件开头)。
- mode='a' 表示打开一个文件用于追加写入,若参数 file 指定文件已存在则打开之,并从文末开始写入 (文件指针将放在文件结尾);若参数 file 指定文件不存在,则创建新文件并写入 (文件指针将放在文件结尾,此时也是开头)。
事实上, mode 可根据需求组合,常见的有:
模式组合 | 含义 | 文件指针位置 |
'rb' | 以二进制模式打开一个文件用于只读 (只能读不能写) | 文件开头 |
'r+' | 以文本模式打开一个文件用于读写 | 文件开头 |
'rb+' | 以二进制模式打开一个文件用于读写 | 文件开头 |
'wb' | 以二进制模式打开一个文件用于写入 (只能写不能读) | 文件开头 |
'w+' | 以文本模式打开一个文件用于读写 | 文件开头 |
'wb+' | 以二进制模式打开一个文件用于读写 | 文件开头 |
ab | 以二进制模式打开文件用于追加写入 (只能写不能读) | 文件结尾 |
a+ | 以文本模式打开一个文件用于读取与追加写入 | 文件结尾 |
ab+ | 以二进制模式打开一个文件用于读取与追加写入 | 文件结尾 |
此外,由于 Python 是区分二进制和文本 I/O 的,因此,在文本模式下 (缺省或指定 mode 参数含 't'),打开文件内容返回 str 对象,并使用指定的 encoding 参数 (若给定) 或 平台默认的字节编解码;在二进制模式下 (指定 mode 参数含 'b'),打开文件内容返回 bytes 对象,且不进行任何解码。
buffering 是一个可选 int,用于设置缓冲策略。buffering=0 表示切换缓冲关闭 (仅允许在二进制模式下);buffering=1 表示选择行缓冲 (仅允许在文本模式下);buffering>1 表示指定固定大小的块缓冲区 (以字节为单位)。若不指定,则默认有 buffering=-1 表示执行默认缓冲策略:
- 二进制文件以固定大小的块进行缓冲,并使用启发式方法确定底层设备的“块大小”以选择缓冲区大小。在许多系统上,缓冲区的长度通常为 4096 Bytes 或 8192 Bytes。
- “交互式”文本文件 (isatty() 结果返回 True 的文件) 使用行缓冲;其他文本文件使用上述用于二进制文件的策略。
其它参数则较少使用,不再赘述,若有兴趣详见官方文档。