第二十二章、文件(高级)

1. 二进制文件

文件都是以字节为单位进行存储的。

文件操作的两种方式:

  1. 文本文件

    • 例如:.py、.c、.cpp、.txt等文件。
    • 用字符串进行操作,写入时自动编码为字节串,读取时自动解码为字符串。
  2. 二进制文件

    • 例如:.mp3、.mp4、.zip、.exe等文件。
    • 直接用字节串或字节数组进行操作,文本数据需要手动编解码。

打开文件

文件只有打开才能进行操作。

打开文件的函数:

函数
说明
open(file, mode='r', encoding=None, newline=None)
打开文件并返回对应的文件对象file,如果该文件不能被打开,则引发 OSError类型的错误。

参数

文件的打开模式mode:

字符
含意
'r'
读取(默认)
'w'
写入,并先清空文件,没有文件则尝试创建文件
'x'
排它性创建,如果文件已存在则失败
'a'
打开文件用于写入,如果文件存在则在末尾追加
'b'
二进制模式
't'
文本模式(默认)
'+'
打开用于更新(读取与写入)

二进制文件的打开模式mode

打开模式示例

字符
含意
'rb'
二进制读取
'wb'
二进制写入,并先清空文件,没有文件则尝试创建文件。
'w+b'
可以实现二进制随机读写,当打开文件时,文件内容将被清零
'r+b'
以二进制读和更新模式打开文件,打开文件时不会清空文件内容
'r+'
以文本模式读和更新模式打开文件,打开文件时不会清空文件内容

读文件的方法

读文件

方法
说明
file.read(size=-1)
从一个文件流中最多读取size个字符或字节,如果不给出参数,则默认读取文件中全部的内容并返回。
file.readline()
读取一行数据, 如果到达文件尾则返回空行
file.readlines(max_chars=-1)
返回每行字符串或字节串的列表,max_chars为最大字符数或字节数

写文件的方法

写文件

方法
说明
file.write(text)
写一个字符串到文件流中,返回写入的字符或字节数
file.writelines(lines)
将字符串的列表或字节串的列表中的内容写入文件

示例

文件:a.txt 的内容如下

abc中文
this is second line

二进制文件读取示例代码如下:

# 二进制文件读取示例

# 以文本方式读取
try:
    with open('a.txt', 'rt') as fr:
        s = fr.read()
        print('s:', s)
        print('字符串的长度', len(s))
except OSError:
    print('文件: a.txt 打开失败!')

# 以二进制方式读取
try:
    with open('a.txt', 'rb') as fr:
        b = fr.read()
        print('b:', b)
        print('字节串的长度', len(b))
except OSError:
    print('文件: a.txt 打开失败!')

文件:b.txt 的内容如下

abcde
ABCDE
123###xxx

二进制文件写入示例代码如下:

# 二进制文件写入示例

# 以二进制方式写入
try:
    with open('b.txt', 'wb') as fw:
        nbytes = fw.write(b'abcde\n')
        print('成功写入', nbytes, '字节!')
        nbytes = fw.write(bytearray(b'ABCDE\n'))
        print('成功写入', nbytes, '字节!')
        fw.writelines([b'123', b'###', bytearray(b'xxx')])
except OSError:
    print('文件: b.txt 打开失败!')