请使用最新版本浏览器访问此演示文稿以获得更好体验。
我们日常在使用计算机时已经接触过各种形式的文件了,如 .txt
、.docx
、.pptx
、.dwg
、.html
、.png
、.mp4
,等等。可以使用 Python 通过代码读取、写入/创建和删除文件,这种过程被称为文件处理。
一般来说,计算机文件分为两种:
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。可以用文件对象(file object)做大部分的文件操作。
文件对象也被称为文件类对象或流,是对外提供面向文件 API 以使用下层资源的对象(带有 read()
或 write()
这样的方法)。根据其创建方式的不同,文件对象可以处理对真实磁盘文件,对其他类型存储,或是对通讯设备的访问(例如标准输入/输出、内存缓冲区、套接字、管道等等)。
实际上共有三种类别的文件对象:原始二进制文件, 缓冲二进制文件以及文本文件。它们的接口定义均在 io
模块中。创建文件对象的规范方式是使用 open()
函数。
open()
函数的签名如下:
open(file, mode='r', buffering=- 1, encoding=None,
errors=None, newline=None, closefd=True, opener=None)
该函数打开 file
并返回对应的文件对象。如果该文件不能被打开,则引发 OSError
。其中:
file
表示将要打开的文件的路径(绝对路径或者相对当前工作目录的路径)。mode
指定了文件被打开的模式,默认 'r'
表示以只读形式打开文本文件,其他访问模式稍后再讲。buffering
用于设置缓存策略(本章略过此内容)。encoding
是对文件进行解码和编码的编码名称,它用于文本模式。默认的编码依赖于平台,为 locale.getencoding()
函数的返回值,其可选值在标准编码页列出,通常建议使用 encoding='utf-8'
。newline
指定如何从流中解析换行符,其值可能为 None
(通用换行模式并将所有换行翻译为 '\n'
)、''
(通用换行模式但不进行翻译)、'\n'
(在类 Unix 系统常用)、'\r'
(macOS 的早期版本常用)、'\r\n'
(在 Windows 系统常用)。例如,打开一个和 main.py
同目录的 poem.txt
文件,以下各行代码的效果是相同的:
f = open('poem.txt')
# f = open('./poem.txt')
# f = open('poem.txt', mode='r')
# f = open('poem.txt', mode='rt', encoding='utf-8')
各种操作系统的路径风格是不一样的,尤其是 Windows 和类 Unix 系统的路径风格差异巨大。不过,在使用相对路径时,在 Windows 系统下也能使用类 Unix 系统的风格,这时常用类 Unix 系统风格。
可选的文件打开模式 mode
包括:
字符 | 含意 |
---|---|
'r' |
读取(默认),以只读方式打开文件。如果文件不存在则报错,文件的指针将会放在文件的开头。 |
'w' |
写入,打开文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除;如果文件不存在则创建该文件。 |
'x' |
排它性创建,创建指定的文件,如果文件存在则返回错误。 |
'a' |
追加,打开供追加的文件。如果已存在则在末尾追加,即文件指针放在文件末尾,如果不存在则创建该文件。 |
'b' |
二进制模式。 |
't' |
文本模式(默认)。 |
'+' |
打开用于更新(可读可写)。 |
这些模式也可以组合使用,可用的组合模式见下页表。
字符 | 含意 |
---|---|
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
如何选择文件的打开模式?
在打开文件后一定要通过文件对象的 close()
方法关闭文件。该方法会将缓冲区任何还没有写入的数据写入文件,然后关闭文件:
f = open('poem.txt')
...
f.close()
为什么应该关闭文件对象?
文件对象有一些常用的属性,多数与构造函数中的参数意义相同,如下表所示:
属性 | 描述 |
---|---|
file.closed |
如果文件已被关闭返回 True ,否则返回 False 。 |
file.mode |
返回被打开文件的访问模式。 |
file.name |
返回文件的名称。 |
file.encoding |
返回文件的字符编码。 |
file.newlines |
包含文件的换行方式,其值可以是 None 、'' 、'\n' 、'\r' 、'\r\n' ,或这些值构成的元组。 |
示例:
f = open('poem.txt')
print('文件名:', f.name) # 文件名: poem.txt
print('是否已关闭:', f.closed) # 是否已关闭: False
print('访问模式:', f.mode) # 访问模式: r
print('文本编码:', f.encoding) # 文本编码: UTF-8
print('换行符:', f.newlines) # 换行符: None
f.close()
可以使用 read()
方法一次读取整个文件:
f = open('poem.txt')
poem = f.read()
print(poem) # 这将打印文件的内容
poem1 = f.read() # 结果为空字符串
print(poem1) # 仅打印一个换行符
f.close()
可以使用 readline()
方法一次读取一行内容,只要返回空字符串,就表示已经到达了文件末尾,空行使用 '\n'
表示。以下代码同样打印整个文件:
f = open('poem.txt')
line = f.readline()
while line != '':
print(line, end='')
line = f.readline()
f.close()
从文件中读取多行时,可以用循环遍历整个文件对象。这种操作能高效利用内存,快速,且代码简单。以下代码同样打印整个文件:
f = open('poem.txt')
for line in f:
print(line, end='')
f.close()
如需以列表形式读取文件中的所有行,可以用 list(f)
或 f.readlines()
。
with
语句在实际处理文件对象时,最好使用 with
语句。该语句自动在结束时关闭文件,从而简化操作,避免出错。示例如下:
with open('poem.txt') as f:
for line in f:
print(line, end='')
在实际处理文件对象时,最好使用 with
语句。该语句自动在结束时关闭文件,从而简化操作,避免出错。示例如下:
with open('poem.txt') as f:
for line in f:
print(line, end='')
要求:
安模作业02-07-学号-姓名.py
的源文件中,通过电子邮件以附件形式发给任课教师。安模作业02-07-学号-姓名
的形式。