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


推荐文章
Go语言使用事件系统实现事件的响应和处理

Go语言可以将类型的方法与普通函数视为一个概念,从而简化方法和函数混合作为回调类型时的复杂性。这个特性和C#中的代理(delegate)类似,调用者无须关心谁来支持调用,系统会自动处理是否调用普通函数

Go语言函数声明(函数定义)

函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块。 因为Go语言是编译型语言,

internet中url的含义是什么?

internet中url的含义是:统一资源定位器。URL是UniversalResourceLocation的缩写,指统一资源定位器,是internet的万维网服务程序上用于指定信息位置的表示方法。它

jQuery contextmenu事件详解

在jQuery中,常用的编辑事件只有一种,那就是contextmenu事件。 举例:禁用鼠标右键 $(function(){ $("body").contextme

C++聚合和组合详解

当一个类的对象拥有另一个类的对象时,就会发生类聚合。类组合是一种聚合形式,其中拥有者类控制被拥有者类对象的生命周期。 我们知道,一个类可以包含成员,而该成员本身又可以是其他类的对象。当一个类C包含一

边界标识法管理动态内存

本节介绍一种解决系统中内存碎片过多而无法使用的方法——边界标识法。 在使用边界标识法的系统管理内存时,可利用空间表中的结点的构成如图1: 图1结构构成 每个结点中包含3个区域,head域、f

什么是JavaBean?

JavaBean使得JSP编程模式变得清晰,程序可读性强。JavaBean将程序的业务逻辑封装成Java类,提高了程序的可维护性和代码的可重用性。接下来就给大家介绍一下什么是JavaBean。 JS

getAttributeNames() 示例

多道程序设计和分时系统

我们已讨论了计算机系统的基本组成和体系结构,现在讨论操作系统。操作系统为执行程序而提供环境。操作系统可以通过许多不同方式来构建,因此内部组织差异很大。不过,它们也有许多共同点,这里将会加以讨论。 多

纯JS实现情人节表白的神器--心里都是你(代码示例)

首先我们来看看预览图:技术点:css-3d、js-随机色、js-transformhtml: css:*{ margin:0; padding:0; } bod

Go语言RPC协议:远程过程调用

RPC协议构建于TCP、UDP或者是HTTP之上,允许开发人员直接调用另一台计算机上的程序,而开发人员无需额外地为这个调用过程编写网络通信相关代码,使得开发网络分布式类型的应用程序更加容易。 Go语

Linux yum源码包安装和卸载过程详解版

Linux下的绝大多数源码包都是用C语言编写的,还有少部分是用C++等其他程序语言编写的。所以,要想安装源码包,必须安装C语言编译器gcc(如果是用C++编写的程序,则还需要安装gcc-c++)。

C++ int,short,long(详解版)

C++ 图1基础的C++数据类型 变量是需要保存整数还是浮点数值; 变量需要存储的最大数和最小数; 变量是需要保存符号(正数和负数)还是只需要保存无符号(只有0和正数)数字; 存储在变量中

表格格式化操作有哪些?

表格格式化操作有哪些?工作表的格式化,包括单元格的格式,如设置单元格中数据的数字格式、字体字号、文字颜色等,以及设置单元格的边框、底纹(背景颜色)、对齐方式等。设置方法如下:(1)选定要设置格式的单元

Dev C++使用教程(使用Dev C++编写C语言程序)

前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中文网”,如下所示: #include intmain() { puts("C语言中文网"); return0; } 本节我

机器学习、深度学习和人工智能三者的关系

机器学习、人工智能和深度学习都是最近很火的词,有的人用截然不同的态度评价它们,好像三者并无联系,有的人却认为它们不过是新瓶装旧酒,都是商家宣传推广的噱头。 这些看法未免有些片面,机器学习、人工智能和

MySQL EXPLAIN和DESCRIBE(查询分析器)

查询是数据库中最频繁的操作,提高查询速度可以有效的提高MySQL数据库的性能。在《MySQL性能优化简述》一节我们了解了如何查询效率低下的SQL语句,本节主要介绍如何分析查询语句。 通过对查询语句的

单向链接 反向链接 图1:反向链接示意图 图2:导入导出链接之间的关系 图3:反向链接与其他链接之间的关系 网站B通过链接指向网站A,那么网站B即可视为网站A的导入链接。 网站A通过链接指

C语言二级指针(指向指针的指针)详解

指针可以指向一份普通类型的数据,例如int、double、char等,也可以指向一份指针类型的数据,例如int*、double*、char*等。 如果一个指针指向的是另外一个指针,我们就称它为二级指

Bash Shell的安装和升级(源码安装)

一般而言,BashShell是很多Linux发行版的默认Shell,所以会随着系统的安装而自动安装。不过确实有一部分读者想要安装较新版本的BashShell,所以本节会具体讲一下其安装方法,希望可以作