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


推荐文章
C#静态类

C#中有很多静态类的例子,例如Console类就是一个静态类。 如果希望构建一个helper工具类,考虑使用静态类。 原因是:helper工具类会使用频繁,如果是非静态的,则每次使用都要在堆上分配

JavaBean实现用户登录界面

实训内容和要求Java 实训步骤 packagecom.eshore.pojo; importjava.io.Serializable; importjava.util.HashMap; i

零基础该怎么学习web前端?

由于前端开发的火热和一些IT巨头公司对web前端开发人员的需求旺盛,让越来越多的人转入前端。前端开发领域是IT技术语言领域唯一一个男女老少都可以快速入门并快速提升兴趣的领域,今天就来聊聊前端到底该怎么

Java Swing布局管理器(详解版)

在使用Swing向容器添加组件时,需要考虑组件的位置和大小。如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加。这样虽然能够灵活控制组件的位置,实现却非常麻烦。

Spring声明式事务管理(基于XML方式实现)

Spring的事务管理有两种方式:一种是传统的编程式事务管理,即通过编写代码实现的事务管理;另一种是基于AOP技术实现的声明式事务管理。由于在实际开发中,编程式事务管理很少使用,所以我们只对Sprin

C语言数据类型转换(自动类型转换+强制类型转换)

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。 自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

wps文件名冲突怎么办?

wps文件名冲突是因为当前文件名和同目录下的其他WPS文件的文件名相同,只需要修改一下当前文件的名称就可以了;或者不保存在同一目录下。拓展:WPS覆盖Windows、Linux、Android、iOS

Go语言函数类型实现接口——把函数作为接口来调用

函数和其他类型一样都属于“一等公民”,其他类型能够实现接口,函数也可以,本节将对结构体与函数实现接口的过程进行对比。 首先给出本节完整的代码: packagemain import( "

C++11 lambda表达式精讲

C++C#Java 声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护性。 简洁:不需要额外再写一个函数或者函数对象,

JSPJava 属 性 说 明 name 必须存在的属性,用来指定一个Bean实例 property 必须存在的属性,可选值为或指定Bean中的属性。当取值为时,则reque

cmd删除文件的命令是什么?

cmd命令删除文件夹或文件删除空文件夹rd/s/q"D:\ProgramFiles\afish"删除里面的文件del/a/f/q"D:\ProgramFiles\afish\123.txt"注意:路径

IE:Mozilla/5.0(WindowsNT10.0;WOW64;Trident/7.0;Touch;rv:11.0)likeGecko Safari:Mozilla/5.0(Macinto

C++ lambda表达式(详解版)

Lambda表达式 [](inta,intb){returnx+y;} [](inta){returna%2==0;} [](inta){cout

Java断言及使用

在JDK1.4之后,Java中增加了断言的功能。断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。断言的定义格式如下: assertboolean表达式

文件压缩zip格式和rar格式的区别是什么?

在现在最常见的压缩文件有zip、rar、7z三种,它们都有各自的优点和缺点。我们用一句话来概括一下:7z压缩率最高,RAR安全性高,ZIP使用范围广。文件压缩打包是最为常见的一种分享方式了,而众多的压

如何声明和创建一个一维数组?

数组包含给定类型的一些对象,并将这些对象依次存储在连续的内存空间中。每个独立的对象被称为数组的元素(element)。元素的类型可以是任何对象类型,但函数类型或不完整类型不能作为数组元素。数组本身也是

检测是否已经安装GCC编译器

如果读者使用的是类Unix操作系统(Unix、Linux、MacOS等),很有可能已经安装好GCC。如想知道是否如此,在命令行提示符后键入cc--version命令。如果已经安装好GCC,并链接到名为

JSP application.getMajorVersion()方法:返回服务器支持的 Servlet API 最大版本号

该方法返回服务器支持的ServletAPI最大版本号。 语法: getMajorVersion() 返回值: 服务器支持的ServletAPI最大版本号。 示例 输出服务器支持的Servl

JS操作CSS样式(非常详细)

CSS样式包括两种形式:样式表中样式和行内样式。DOM2级规范针对样式表提供了一套API。在DOM2级规范之前,还可以使用标签对象的style属性访问行内样式。 读写行内样式 任何支持style属性

MySQL WHERE:条件查询

在使用MySQLSELECT语句时,可以使用WHERE子句来指定查询条件,从FROM子句的中间结果中选取适当的数据行,达到数据过滤的效果。 语法格式如下: WHERE{,,…} 其中,判定运算其结