前言:文件系统是操作系统的重要组成部分,它规定了计算机对文件和目录进行操作处理的各种标准和机制。以此为基础,编程语言提供了文件类型,在程序中亦可通过文件实现数据的输入输出。文件的输入输出是指从已拥的文件中读取数据,并将处理的结果按照一定格式输出到文件中,适用于大批量额数据处理要求。
一、文件的基本概念
- 1.1、操作系统对数据进行管理是以文件为单位的,当访问磁盘等外存上的数据时,必须先按文件名找到指定的文件,然后再从该文件中读取数据;如果要向外部介质上存储数据,也必须先创立一个文件,才能向其输出数据。在程序中对文件访问和处理时,情况是类似的,所有的操作都与文件的表示、文件的编码和文件的类型有着密不可分的关系。
文件是存储在外部介质上的数据集合,通常可以长久保存,也称为磁盘文件。 - 1.2、文件的编码
按照文件的编码方式,可将文件分为两种类型:文本文件和二进制文件。
二、文件操作
程序对文件的操作一般包括:打开文件
、读取文件
、对文件数据类型进行处理
、写入文件
和关闭文件
等。信息项是构成文件内容的基本单位,Python文本的信息项是字符,二进制文件的信息项是字节。读指针用记录文件当前的读取位置,它指向下一个将要读取的信息项;写指针来记录文件当前的写入位置,要写入的下一个信息项将从该位置处存入。
- 2.1、文件的打开与关闭
打开文件是指建立文件对象和物理文件的关联以及建立文件的各种相关信息。Python的open()语句是返回一个文件的对象,括号中通常包含两个参数:<文件对象>= open(<文件名>[,<模式>])
,第一个参数<文件名>
表示程序中需要操作的文件对应的完整物理文件名。第二个字符串类型参数<模式>,表示文件使用的方式,<模式>参数是可以省略的,省略默认为r
,使用方式如下:
模式 | 含义 |
r | 以只读方式打开 |
w | 以写方式打开一个文件,若这个文件已存在,则覆盖原来的内容;若这个文件不存在,则创建这个文件 |
x | 创建一个新文件,以写方式打开,若文件已存在,则报错FileExistsError |
a | 以写方式打开,写入的内容追加在文件的末尾 |
b | 表示二进制文件,添加子其他控制字符后 |
t | 表示文本文件,默认值 |
+ | 以修改方式打开,支持 读/写 |
- 当处理完一个文件后,需要调用以下语句关闭文件:
<文件对象>.close()
文件关闭后可以保证正常释放文件对象所占用的系统资源 。
下面以读写二进制模式打开当前目录的文件实例
>>> import os >>> os.chdir('/Users/wangchong/Desktop') >>> f = open('JK.text','rb+')
- 上面的前两条语句将当前文件JK.text目录设置在桌面,第三条语句创建了文件对象
f
,f与已存在的文件'/Users/wangchong/Desktop/JK.text'
建立关联。 - 2.2、定位通过open 语句创建了一个文本对象
f
后,读/写指针会定位在文件的头部即最左边开始的位置,然后文件中的信息将按照从左到右的顺序被访问,这称为顺序存取。磁盘中的信息是允许随机访问的。所以,我们将读/写指针移动到磁盘的任何位置进行存取操作。Python 语言中的文件定位语句seek(),可以帮助我们实现文件的随机读/写。seek()语句的格式如右:f.seek(<偏移值>[,<起始位置>])
其中,起始位置为0 表示 来自文件起始处开始(默认值,可省略),1表示从当前文件指针位置开始,2表示从文件末尾开始。偏移值表示从起始位置再移动一定量的距离,偏移值的单位是字节(bye)。偏移值为正数表示向右(即文件尾的方向)移动,偏移值为负数表示向左(即向文件头的方向)移动。起始位置非0,即从当前位置或文件尾部开始访问文件时,只有b模式可以指定非0的偏移值。
- 随机访问二进制文件示例:(文件
JK.text
在桌面)
>>> import os >>> os.chdir('/Users/wangchong/Desktop') >>> file1 = open('JK.text','rb+') >>> file1.write(b'Be at war with your vices') 25 >>> file1.seek(6) 6 >>> file1.read(3) b'war' >>> file1.seek(-5,2) 20 >>> file1.read(4) b'vice' >>> file1.close()
- 本例以二进制读/写方式打开空的文本文件
'/Users/wangchong/Desktop'
,并向该文件中写入25
个二进制数形式的字符。然后通过seek语句将指针从头文件开始移动6个字节
,1个字节对应一个字符,再从第7个字节开始读取3个字节,对应的字符为b'war'
。之后又将指针从文件尾部开始向左移动5个字节,定位在vices
之前,再读取4个字节得到对应的字符b'vice
。 - 随机访问文本文件示例
>> import os >>> os.chdir('/Users/wangchong/Desktop') >>> file1 = open('JK.text','r+') >>> file1.write('微风送来淡淡花香') 8 >>> file1.seek(8) 8 >>> file1.read(4) Traceback (most recent call last): File "<input>", line 1, in <module> File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py", line 322, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 0: invalid start byte >>> file1.seek(0) 0 >>> file1.seek(8)
- 2.3、文件的读取、写入、追加
- 2.3.1、从文件中读取数据:Python 为文件的读取提供了三种文件对象方法,方法的返回值即为读取的内容,可以根据返回值的不同,保存到相应类型的变量中。
- file.read(size) 方法:该方法返回一个字符串,内容为size的文本。数字类型参数size表示读取的字符数,可以省略。如果省略size参数,则表示读取文件所有内容并返回。如果已达到文件的末尾,file.read()将返回一个空字符串(
''
)。例如:
>>> import os >>> os.chdir('/Users/wangchong/Desktop') >>> file1 = open('JK.txt') >>> file.read() '锄禾日当午' >>> file.read() ''
- file.readline() 方法: 该方法返回一个字符串,内容为文件的当前一行。换行符 (
\n
) 留在字符串的末尾。如果已达到文件的末尾,file.readline()将返回一个空字符串(''
)。如果是一个空行,则返回'\n'
。
>>> import os >>> os.chdir('/Users/wangchong/Desktop') >>> file1 = open('JK.txt') >>> file1.seek(0) 0 >>> file1.readline() '锄禾日当午' >>> >>> file1.readline() ''
- file.readlines() 方法:该方法返回一个列表,列表中的每个字符串类型元素对应文件的每行(包括结尾的换行符号
“\n”
)。例如:
>>> file1.readlines() ['锄禾日当午\n'] >>> file1.readlines() [] >>> file1.close()
- 2.3.2、将数据写入文件:
file.write(string) 方法将字符串 string 的内容写到对应的文件中,并返回写入的字符数。但write 语句不会自动换行,如果需要换行,则需要使用换行字符\n
。例如:
>>> file1 = open('JK.txt','w') >>> file1.write('宝剑锋从磨砺出\n') >>> file1.close()
- 其中,
'\n'
代表一个字符。以w
模式打开的JK.txt
文件的原有内容将被覆盖。 - 2.3.3、将数据追加到文件末尾:
>>> file1 = open('JK.txt','a') >>> file1.write('梅花香自苦寒来\n') >>> file1.close()
以a
模式打开 JK.txt
文件,指针会移动到末尾处,写入的内容将追加到该文件中,但是必须关闭文件才能生效。