Python open() 语法
open() 是 Python 的一个内置函数,它用于打开一个文件,然后返回一个文件对象(即 file 对象),以便对文件进行读取、写入、追加等操作。
语法:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)说明:
open() 函数接收如下所示的参数。
file(必选):要打开的文件路径和名称,可以使用相对路径或绝对路径。mode(可选,默认值:'r'):打开文件的模式。buffering(可选,默认值:-1):文件缓冲的大小。encoding(可选,默认值:None):编码方式。errors(可选,默认值:None):编码错误时的处理方式。可选值包括:'strict'(抛出 UnicodeError 异常)、'ignore'(忽略错误)和 'replace'(使用 ? 代替错误)等。newline(可选,默认值:None):指定文本模式下,读取或写入文件时使用的换行符。可选值包括:'\n'、'\r'、'\r\n' 等。closefd(可选,默认值:True):用于指定文件关闭时是否同时关闭文件描述符。opener(可选,默认值:None):一个可调用对象,用于打开文件,默认值为 None(即使用内置的 open() 函数打开)。
参数 mode 用于设置打开文件的模式,常用的取值如下表所示。
| 取值 | 说明 |
|---|---|
| 'r'(默认值) | 只读模式。 |
| 'w' | 写入模式。如果文件存在,则覆盖文件中的内容;如果文件不存在,则创建一个新文件。 |
| 'x' | 独占写入模式。如果文件不存在,则创建一个新文件;如果文件已经存在,则会抛出 FileExistsError 异常。 |
| 'a' | 追加模式。如果文件存在,则在文件末尾添加新内容;如果文件不存在,则创建一个新文件。 |
| 'b' | 二进制模式。用于处理非文本文件,比如图片、音频、视频等。 |
当然了,我们也可以同时使用多种文件模式,模式之间使用英文逗号隔开即可。比如想要使用 “只读模式” 和 “二进制模式” 来打开文件,可以这样写。
f = open('filename', 'rb')注意:
Python open() 摘要
| 使用频率 | 极高 |
|---|---|
| 官方文档 | 查看 |
| 相关函数 | input()、print() |
Python open() 示例
接下来,我们通过几个简单的例子来讲解一下 Python open() 函数是如何使用的。
示例 1:open() 打开并读取文件
f = open('files/hello.txt', 'r')
content = f.read()
print(content)
f.close()分析:
使用 open() 打开并读取文件,需要使用 'r' 模式。open() 函数会返回一个文件对象,然后使用该文件对象的 read() 方法,即可读取文件内容。
示例 2:open() 打开并写入文件
f = open('files/hello.txt', 'w')
f.write('Hello lvye!')
f.close()分析:
使用 open() 打开并写入文件,需要使用 'w' 模式。open() 函数会返回一个文件对象,然后使用该文件对象的 write() 方法,即可往文件写入内容。
示例 3:open() 打开并追加内容
f = open('files/hello.txt', 'a')
f.write('Hello lvye!')
f.close()分析:
使用 open() 打开文件并追加内容,需要使用 'a' 模式。open() 函数会返回一个文件对象,然后使用该文件对象的 write() 方法,即可往文件末尾追加内容。
示例 4:open() 打开并读取一行内容
f = open('files/hello.txt', 'r')
content = f.readline()
print(content)
f.close()分析:
想要读取一行内容,可以使用 file 对象的 readline() 方法。
示例 5:open() 打开并读取所有行内容
f = open('files/hello.txt', 'r')
content = f.readlines()
print(content)
f.close()分析:
想要读取所有行的内容,可以使用 file 对象的 readlines() 方法。
示例 6:open() 搭配 with 语句
with open('files/hello.txt', 'r') as f:
content = f.readline()
print(content)分析:
with 语句可以自动调用 close() 方法来关闭文件。不过 with 语句只能帮我们关闭文件,并不能帮我们处理异常。如果在文件操作中出现异常,还是需要使用 try except 语句 来处理。
注意: open() 函数和 f.read()、f.write() 等不一样。不管是纯文本文件,还是二进制文件,都可以使用 open() 函数来打开的。
file 对象
open() 函数会返回一个 file 对象,该对象提供了一些有用的属性,用于获取文件的相关信息,如下表所示。
| 属性 | 说明 |
|---|---|
| name | 获取文件名称 |
| mode | 获取文件的打开模式 |
| encoding | 获取文件的编码格式 |
| closed | 判断文件是否已关闭。如果已关闭,则返回 True,否则返回 False |
此外,file 对象还提供了非常多方法,用于对文件进行操作。
| 方法 | 说明 |
|---|---|
| read(size) | 读取 size 个字节的内容。如果没有指定 size,则读取整个文件 |
| readline() | 读取文件一行的内容 |
| readlines() | 读取文件中所有行的内容 |
| write(string) | 将字符串写入文件 |
| writelines(list) | 将字符串列表写入文件,每个元素为一行的字符串 |
| close() | 关闭文件 |
常见问题
1. open() 与 io.open() 这 2 个有什么区别?
在 Python 3 中,open() 函数和 io.open() 函数实际上是同一个函数。它们指向的是底层的 io 模块中的文件打开实现。
之所以 io.open() 仍然存在,主要是为了向前兼容。在 Python 2 中,open() 函数的行为和功能与 Python 3 中的有所不同,而 io.open() 则提供了与 Python 3 open() 类似的功能。因此,为了方便那些从 Python 2 迁移到 Python 3 的代码,io.open() 被保留了下来。
2. 为什么处理文件路径时推荐使用原始字符串(r 前缀)?
当我们处理文件路径时,尤其是在 Windows 系统上,路径分隔符是反斜杠 “\” 。反斜杠在 Python 字符串中是一个特殊的字符,用于表示转义字符(比如 “\n” 表示换行符, “\t” 表示制表符)。
如果你的文件路径中包含这些转义序列,而不使用原始字符串,Python 解释器就会错误地解析它们,导致路径不正确。
3. 如何确保写入文件的内容立即保存(持久化)?
当我们使用 file.write() 方法写入文件时,内容通常不会立即写入到磁盘。相反,它会先被写入到一个内部缓冲区中。这样做是为了提高写入效率。只有当缓冲区满、文件对象关闭(例如 with 语句结束)、或者手动刷新缓冲区时,内容才会被真正写入到磁盘。
如果我们需要确保写入的内容立即被保存到磁盘,可以结合使用 file.flush() 和 os.fsync():
file.flush():这个方法会强制将文件对象内部缓冲区中的数据写入到操作系统的缓冲区。os.fsync(file.fileno()):这个函数来自 os 模块,它会强制将操作系统缓冲区中的数据同步到磁盘。file.fileno() 用于获取文件对象的文件描述符。
