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 语言很强大。
是的,的确非常强大!


推荐文章
如何向PyPI上传Python程序包?

对于Python包而言,如果没有有组织的保存、上传和下载方式,那么它是没有用的。Python包索引(一个搜索下载包的平台)是 Python社区开源包的主要来源,任何人都可以免费上传新的包,唯一的要求就

深入底层了解Python字典和集合,一眼看穿他们的本质!

字典和集合是进行过性能高度优化的数据结构,特别是对于查找、添加和删除操作。本节将结合实例介绍它们在具体场景下的性能表现,以及与列表等其他数据结构的对比。 例如,有一个存储产品信息(产品ID、名称和价

Java局部内部类

局部内部类是指在一个方法中定义的内部类。示例代码如下: publicclassTest{ publicvoidmethod(){ classInner{ //局部内部类 } } } 局

DCGAN及实际应用(虚构MNIST图像)

本节将使用一个简单的GAN,它使用CNN来学习如何伪造MNIST图像并生成不属于原始数据集的新图像。这个想法是将CNN与GAN一起使用来提高处理图像数据集的能力。值得注意的是,之前的方法是使用具有完全

变量的作用域和存储方式,C语言变量作用域和存储方式完全攻略

变量按作用域可分为“局部变量”和“全局变量”。按存储方式又可分为“自动变量(auto)”、“静态变量(static)”、“寄存器变量(register)”和“外部变量(extern)”。注意,这里的“

File类(在JSP中的使用)详解

File对象用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读/写权限等,但File对象并不涉及对文件的读/写操作。 创建File对象的构造方法有三个: File(Stringfi

Java抽象(abstract)类详解

Java语言提供了两种类,分别为具体类和抽象类。前面学习接触的类都是具体类。这一节介绍一下抽象类。 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如

Spring Cloud是什么?Spring Cloud版本介绍

SpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些

Shell(Bash)用户自定义变量使用方法详解

用户自定义变量是最常用的变量类型,其特点是变量名和变量值都是由用户自由定义的。 那么,该如何定义变量呢?很简单,只需执行"变量名=变量值"命令即可,不过要遵守变量定义规则。例如: [root@lo

k8s是干嘛的?

K8S(Kubernetes)是什么?是干嘛的?k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以

PHP break:跳出循环

break关键字可以使程序跳出当前的循环,可以在switch、for、while和dowhile 等语句中使用,这样可以终止循环体的代码并立即跳出当前的循环,执行循环之后的代码。 break关键字的

C语言水仙花数,阿姆斯特朗数

阿姆斯特朗数也就是俗称的水仙花数,是指一个三位数,其各位数字的立方和等于该数本身。例如:153=13+53+33,所以153就是一个水仙花数。求出所有的水仙花数。 算法思想 对于阿姆斯特朗数问题,根

Python能干什么,Python的应用领域

Python作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python的应用领域有哪些呢? Python的应用领域非常广泛,几乎所有大中型互联网企业都在使用Python完成各

sessionstorage和localstorage的区别是什么?

localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现)。

Spring目录结构和基础JAR包介绍

Springhttp://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 图1 访问结果 图2  解压后目

Python while循环详解

while循环的语法格式如下: [init_statements] whiletest_expression:    body_statements    [iteration_statements

URL的组成结构与含义简述

我们每天可能要打开几十个页面,但你是否观察过它们的URL地址?接下来带大家“庖丁解牛”,把URL拆开看看。 一个标准的URL地址由protocol、hostname、port、path、parame

高效开发者是如何个性化 VS Code 插件与配置的?

VisualStudioCode我每天花在VSCode上的时间长达5~6个小时,因此按照我的需求优化VSCode配置十分必要。过去这2年里,我试过各种各样的插件与配置,而现在我感觉一切都完美了,是时候

Java Float类

Float类在对象中包装了一个基本类型float的值。Float类对象包含一个float类型的字段。此外,该类提供了多个方法,能在float类型与String类型之间互相转换,同时还提供了处理floa

jQuery event对象常用属性汇总

当一个事件发生的时候,与这个事件有关的详细信息都会临时保存到一个指定的地方,这个地方就是event对象。每一个事件,都有一个对应的event对象。打个比方,我们都知道飞机都有黑匣子,每次飞机出事(一个