第二十二章、文件(高级)
1. 二进制文件
文件都是以字节为单位进行存储的。
文件操作的两种方式:
-
文本文件
- 例如:.py、.c、.cpp、.txt等文件。
- 用字符串进行操作,写入时自动编码为字节串,读取时自动解码为字符串。
-
二进制文件
- 例如:.mp3、.mp4、.zip、.exe等文件。
- 直接用字节串或字节数组进行操作,文本数据需要手动编解码。
打开文件
文件只有打开才能进行操作。
打开文件的函数:
函数
说明
open(file, mode='r', encoding=None, newline=None)
打开文件并返回对应的文件对象file,如果该文件不能被打开,则引发 OSError类型的错误。
参数
- file:文件路径名。
- mode:打开模式,默认是’r’读取文件,’w’是创建新文件并写入文件。
- encoding:文本文件的编码,中文是’utf-8’或’gb2312’/’gbk’/’gb18030’。
- newline:换行符号,windows是CRLF(’\r\n’),mac和Linux是LR(’\n’)。
文件的打开模式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 打开失败!')