使用 Python 读写文件

一. 基本概念

文件

文件作为数据存储的单位,通常用来长期存储数据。文件中的数据是以字节为单位进行顺序存储的。操作文件的操作流程如下:

  • 打开文件
  • 读写文件
  • 关闭文件

注:任何的操作系统,同一个应用程序同时打开文件的数量是有最大限制的,所以在用完文件后需要关闭。

文件的打开函数 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.seekf.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))

运行结果:

通常,二进制文件会用到 seektell

二. 汉字编码

汉字常用的 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容