Python open()打开文件
文件的操作主要分为读取和写入两种,读取文件是指将磁盘上的文件内容读入内存或命名管道,写入文件则是将内存、缓冲区或命名管道内的内容写入磁盘上指定文件。Python 中操作文件也有两种常用方法,一是使用内置支持的 file 对象完成大部分文件操作,二是使用 os 模块提供的更为丰富的函数完成对文件和目录的操作。
在读取或写入文件之前,必须使用内置函数 open( ) 打开它,其语法是:
通常,文件以文本模式被打开,这意味着从文件读出和向文件写入的字符串会被特定的编码方式(默认是 UTF-8)编码。而以二进制模式打开文件表示数据会以字节对象的形式读出和写入,这种模式应该用于存储非文本内容的文件。
在文本模式下,读取时默认会将平台有关的行结束符(UNIX 上是 \n,Windows 上是 \r\n)转换为 \n,在文本模式下写入时默认会将出现的 \n 转换成平台有关的行结束符,这种做法可能会损坏二进制文件,因此对不同类型的文件要采用正确的模式读写。
buffering 用于指明访问文件时的缓冲区设置,取值为 0 表示不使用缓冲,取值为 1 表示在访问文件进行时使用行缓冲(仅用于文本模式),取值为大于 1 的整数表示使用固定大小的缓冲区进行缓冲,取值为负数表示使用系统默认大小的缓冲区。
encoding 用于编码或解码文件的编码名称。该参数应仅用于文本模式,默认的编码是平台依赖的。
errors 用于指定如何操作编、解码的错误,此参数不能用于二进制模式。常见的可取值如表 2 所示。
newline 用于控制通用换行模式如何运行(只支持文本模式),取值可以是 None、(空串)、\n、\r 和 \r\n。当读取输入时,如果取值为 None,启用通用换行模式,输入中的行尾可以是 \n、\r或\r\n,在返回给调用者前会被转换为\n;如果参数值是(空串)也将启用通用换行模式,但是返回给调用者时行尾不做转换;
如果取值为其他任意合法值,输入行以给定字符串结束,返回给调用者时行尾也不做转换。当输出写入时,如果取值为None,任意写入的\n将被转换为系统默认的行分隔符;如果取值为(空串)或 \n,不进行转换;如果取值为其他任意合法值,所有写入的 \n 字符将转换为给定字符串。
closefd 指明关闭文件时文件描述符的状态。若 closefd 为 False,且给定文件描述符(注意不是文件名),则当文件关闭时文件描述符将保持打开。若给定文件名,则 closefd 必须为 True(默认),否则将引发错误。
opener 用于传递调用一个自定义打开器,通过调用 opener 获取文件对象的文件描述符。
以下代码使用内置支持的 file 对象展示了常见的文件操作:
生成的 test.txt 文件的内容如下所示:
在读取或写入文件之前,必须使用内置函数 open( ) 打开它,其语法是:
file object = open(filename [, accessmode="r"] [, buffering="-1"] [, encoding=None] [, errors=None] [, newline=None] [, closefd=True] [, opener=None])
其中 filename 是要访问的文件的文件名字符串,accessmode 用于指定文件打开的模式,详细的模式见表 1。模式 | 描述 |
---|---|
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 所示。
可取值 | 描述 |
---|---|
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 语言很强大。
是的,的确非常强大!
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算