一. 基本概念
文件
文件作为数据存储的单位,通常用来长期存储数据。文件中的数据是以字节为单位进行顺序存储的。操作文件的操作流程如下:
- 打开文件
- 读写文件
- 关闭文件
注:任何的操作系统,同一个应用程序同时打开文件的数量是有最大限制的,所以在用完文件后需要关闭。
文件的打开函数 open(file, mode='rt')
用于打开一个文件对象,文件打开失败时触发异常;文件的关闭方法 F.close()
用于关闭文件,释放系统资源。
上述 open
函数中用到了 mode
参数,即文本文件操作模式,对文本文件的读写需要用字符串 str
进行读取和写入数据。模式字符:t'
表示默认文件中存储的数据为字符数据,以行为单位分隔。
注: 在 Linux 系统中,换行符为
\n
,在 Windows 下换行符则为\r\n
。在 Python 中内部统一用\n
作为换行符进行分隔:即在文本文件模式下,各操作系统的换行符在读入 Python 内部时,换为字符\n
。
实际中常用的文件读取方式即文件的迭代读取:open
函数返回的文件流对象作为可迭代对象,并且是个迭代器:
>> f = open('example.txt')
>> iter(f)
<_io.TextIOWrapper name='example.txt' mode='r' encoding='cp936'>
>> iter(f)
<_io.TextIOWrapper name='example.txt' mode='r' encoding='cp936'>
>> next(f)
'A\n'
>> next(f)
'B\n'
>> next(f)
'C\n'
>> next(f)
StopIteration:
对于二进制文件,默认文件中存储的都是以字节为单位的数据,通常有人为规则格式,需要以字节为单位进行读写。比如,Linux 下常用的命令 ls
对应的二进制文件如下:
下面,我们就利用 Python 来读取该二进制文件中的内容:
>> f = open('/bin/ls', 'rb')
>> f.read(4)
b'\x7fELF'
>> f.read(1)
b'\x02'
>> f.read(2)
b'\x01\x01'
在以二进制读的形式打开文件 /bin/ls
之后,使用了 read
函数依次读取了 4 个字节、1 个字节以及 2 个字节。Python 中关于文件句柄的方法非常丰富,下面我们就来介绍一下他们吧~
文件句柄的常用方法
关于文件句柄的常用方法总结如下:
方法名 | 作用 |
---|---|
read(size) |
读取 size 个字符,缺省时读取全部内容,并返回一个字符串;每次读取时在上一次的位置继续向下读,到达文件末尾则返回空字符串。二进制模式下,读取和返回的都是字节串。 |
readline() |
读取 1 行,返回一个字符串;每次读取一行,到达文件末尾则返回空字符串。二进制模式下,读取和返回的都是字节串。 |
readlines() |
每行内容作为一个字符串,返回一个列表;二进制模式下,返回一个字节串列表。 |
write(x) |
对于文本模式,X 必须为字符串;对于二进制模式,x 必须为字节串。返回值为写入的字符数。 |
writeslines(L) |
按行顺序写入列表内的每个元素。 |
关于 f.read
的返回类型:对于文本模式 t
打开的文件,返回字符串 str
;对于二进制模式 b
打开的文件,返回字节串 bytes
。关于 f.write(x)
参数 x
的类型:对于文本模式,x
必须为字符串;对于二进制模式,x
必须为字节串。
>> f = open('a.txt', 'wt')
>> f.write('A')
>> f.close()
运行结果:
>> f = open('b.txt', 'wb')
>> f.write(bytearray([66]))
>> f.close()
运行结果:
下面是 read
readline
readlines
的使用示例:
with open('example.txt') as f:
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
运行结果:
with open('example.txt') as f:
print(f.readlines())
运行结果:
with open('example.txt') as f:
print(f.read())
运行结果:
f.seek()
方法用来改变当前文件的读写位置:f.seek(偏移量, 相对位置)
:
- 偏移量:大于 0 的数代表向文件尾方向移动;小于 0 的数代表向文件头方向移动。
- 相对位置:0 代表从文件头开始偏移;1 代表从当前位置开始偏移;2 代表从文件尾开始偏移。
f.tell()
方法返回当前文件读写位置。
下面是关于两方法使用的示例:
with open('example.bin', 'wb') as f:
f.writelines([b'Python\n', b'Hello World\n', b'123456\n'])
文件内容如下:
使用 f.seek
和 f.tell
:
with open('example.bin', 'rb') as f:
print(f.tell())
print(f.read(6))
print(f.tell())
print(f.seek(7, 1))
print(f.read(5))
print(f.seek(-7, 2))
print(f.read(7))
运行结果:
通常,二进制文件会用到 seek
和 tell
。
二. 汉字编码
汉字常用的 2 种编码方式即国标系列和国际标准。其中国标系列即 Windows 常用的编码方式:
- GB18030 (二字节或四字节编码,共27533个汉字)相比 GBK 多出的部分使用的是四字节编码
- GBK(二字节编码,共21003个汉字)
- GB2312(二字节编码,共6763个汉字)
国际标准则用于 Linux、Mac OS X、IOS、Android 等系统,如:UNICODE 16、UNICODE 31 等。
注:Python3 的字符串存储的是 Unicode 编码,但要存储在外部(磁盘,网络等)的时候,需要
encode
编码。
Python 编码(encode)字符串:gb2312
gbk
gb18030
utf-8
ascii
。
注:在 Python 源文件第一行或第二行写入如下内容即告诉解释执行器,此文件的编码类型是什么,如:
# -*- coding: gbk -*-
设置源文件编码格式为 GBK ;# -*- coding: utf-8 -*-
设置源文件编码格式为utf-8
。Python3 源文件默认使用的编码方式即utf-8
。
三. 总结
各类模式:
符号 | 含义 |
---|---|
t |
以文本模式打开,是默认的文件打开方式; |
b |
二进制模式打开; |
r |
以只读的形式打开,是默认的打开方式; |
w |
以写的方式打开,会删除文件中原有的内容; |
a |
以追加的方式打开文件,原有内容不会删除; |
x |
创建新文件,文件已存在时,将触发异常; |
文本文件操作模式:
- 默认文件中存储的数据为字符数据,以行为单位分隔,在 Python 中内部统一用
\n
作为换行符进行分隔; - 对文本文件的读写需要用字符串
str
进行读取和写入数据。
二进制文件操作模式:
- 默认文件中存储的都是以字节为单位的数据,通常有人为规则格式;
- 需要以字节为单位进行读写
open()
函数:
open(file, mode='rt')
用于打开一个文件对象,如果打开文件失败,则会触发 OSError
;
open()
函数返回一个表示文件的对象,可作为迭代器;结合 next()
函数使用,每次返回一行内容,停止迭代时触发 StopIteration
。