目录

一、示例

二、语法


一、示例

假设在 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 的文件) 使用行缓冲;其他文本文件使用上述用于二进制文件的策略。

其它参数则较少使用,不再赘述,若有兴趣详见官方文档。