首页 > 编程笔记 > Python笔记 阅读:176

Python open()打开文件

文件的操作主要分为读取和写入两种,读取文件是指将磁盘上的文件内容读入内存或命名管道,写入文件则是将内存、缓冲区或命名管道内的内容写入磁盘上指定文件。Python 中操作文件也有两种常用方法,一是使用内置支持的 file 对象完成大部分文件操作,二是使用 os 模块提供的更为丰富的函数完成对文件和目录的操作。

在读取或写入文件之前,必须使用内置函数 open( ) 打开它,其语法是:

file object = open(filename [, accessmode="r"] [, buffering="-1"] [, encoding=None] [, errors=None] [, newline=None] [, closefd=True] [, opener=None])

其中 filename 是要访问的文件的文件名字符串,accessmode 用于指定文件打开的模式,详细的模式见表 1。

表 1:open( ) 函数的 accessmode 参数
模式 描述
r 以只读方式打开文件,指针指向文件头
rb 以只读方式打开二进制文件,指针指向文件头
r+ 以读写方式打开文件,指针指向文件头
rb+ 以读写方式打开二进制文件,指针指向文件头
w 以只写方式打开文件,若文件已存在则覆盖该文件,若文件不存在则创建新文件
wb 以只写方式打开二进制文件,若文件已存在则覆盖该文件,若文件不存在则创建新文件
w+ 以读写方式打开文件,若文件已存在则覆盖该文件,若文件不存在则创建新文件
wb+ 以读写方式打开二进制文件,若文件已存在则覆盖该文件,若文件不存在则创建新文件
a 以追加方式打开文件,指针指向文件尾,若文件不存在则创建新文件
ab 以追加方式打开二进制文件,指针指向文件尾,若文件不存在则创建新文件
a+ 以追加、读写方式打开文件,指针指向文件尾,若文件不存在则创建新文件
ab+ 以追加、读写方式打开二进制文件,指针指向文件尾,若文件不存在则创建新文件

通常,文件以文本模式被打开,这意味着从文件读出和向文件写入的字符串会被特定的编码方式(默认是 UTF-8)编码。而以二进制模式打开文件表示数据会以字节对象的形式读出和写入,这种模式应该用于存储非文本内容的文件。

在文本模式下,读取时默认会将平台有关的行结束符(UNIX 上是 \n,Windows 上是 \r\n)转换为 \n,在文本模式下写入时默认会将出现的 \n 转换成平台有关的行结束符,这种做法可能会损坏二进制文件,因此对不同类型的文件要采用正确的模式读写。

buffering 用于指明访问文件时的缓冲区设置,取值为 0 表示不使用缓冲,取值为 1 表示在访问文件进行时使用行缓冲(仅用于文本模式),取值为大于 1 的整数表示使用固定大小的缓冲区进行缓冲,取值为负数表示使用系统默认大小的缓冲区。

encoding 用于编码或解码文件的编码名称。该参数应仅用于文本模式,默认的编码是平台依赖的。

errors 用于指定如何操作编、解码的错误,此参数不能用于二进制模式。常见的可取值如表 2 所示。

表 2:open() 函数的 errors 参数
可取值 描述
strict 或 None 如果有编码错误,引发 ValueError 异常
ignore 忽略错误
replace 在出现畸形数据的地方插入替代符号
surrogateescape 将任何不正确的字节以 Unicode Private Use Area 中的代码点表示
xmlcharrefreplace 编码不支持的字符会用适当的 XML 字符替换,只支持写入文件
backslashreplace 使用反斜杠转义序列替换畸形数据
namereplace 使用\n{…}转义序列替换不支持的字符,只支持写入文件

newline 用于控制通用换行模式如何运行(只支持文本模式),取值可以是 None、(空串)、\n、\r 和 \r\n。当读取输入时,如果取值为 None,启用通用换行模式,输入中的行尾可以是 \n、\r或\r\n,在返回给调用者前会被转换为\n;如果参数值是(空串)也将启用通用换行模式,但是返回给调用者时行尾不做转换;

如果取值为其他任意合法值,输入行以给定字符串结束,返回给调用者时行尾也不做转换。当输出写入时,如果取值为None,任意写入的\n将被转换为系统默认的行分隔符;如果取值为(空串)或 \n,不进行转换;如果取值为其他任意合法值,所有写入的 \n 字符将转换为给定字符串。

closefd 指明关闭文件时文件描述符的状态。若 closefd 为 False,且给定文件描述符(注意不是文件名),则当文件关闭时文件描述符将保持打开。若给定文件名,则 closefd 必须为 True(默认),否则将引发错误。

opener 用于传递调用一个自定义打开器,通过调用 opener 获取文件对象的文件描述符。

以下代码使用内置支持的 file 对象展示了常见的文件操作:
#打开文件
f = open("test.txt", "w+")
#获取文件描述符
print(f.fileno())
#写入文本
f.write("Python 语言很强大。\n是的,的确非常强大!\n")
#关闭文件
f.close()
#以只读方式打开文件
f = open("test.txt", "r")
#读取文件内容并输出至终端屏幕
print(f.read())
#关闭打开的文件
f.close()
上述代码的运行结果如下所示:

>>> f = open("test.txt", "w+")
>>> print(f.fileno())
3
>>> f.write("Python 语言很强大。\n是的,的确非常强大!\n")
25
>>> f.close()
>>> f = open("test.txt", "r")
>>> print(f.read())
Python 语言很强大。
是的,的确非常强大!

>>> f.close()


生成的 test.txt 文件的内容如下所示:

Python 语言很强大。
是的,的确非常强大!

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章