概述
计算机都是以二进制存储文件的,如mp3、图片等,文本文件也是如此,在本节中以二进制模式写入文件
写文件的很多操作,与读文件的操作是相同的,建议先看 读取二进制文件
打开文件
读写文件,要先通过内置open()函数打开文件
open('文件路径',mode='模式')
常用参数说明:
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式,可省略。详细介绍在下面
注意:
采用 二进制 模式读取文件时,不要 指定编码,否则报错:
ValueError: binary mode doesn't take an encoding argument
常用模式:
‘wb’:只写
以二进制格式打开一个文件只用于写入。
如果该文件已存在则打开文件,清空文件内容 并开头开始编辑。
如果该文件不存在,创建新文件。
‘wb+’:读写
以二进制格式打开一个文件用于读写。
如果该文件已存在则打开文件,先 清空文件内容 并从开头开始编辑,也就是说打开文件后读取该文件,内容是空的。写入文件后,可读取文件
如果该文件不存在,创建新文件。
‘ab’:追加
以二进制格式打开一个文件用于追加。
如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。
如果该文件不存在,创建新文件进行写入。
‘ab+’:追加且可读
以二进制格式打开一个文件用于追加。
如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。
如果该文件不存在,创建新文件用于读写。
例子:f=open('d:\\1.txt','wb')
关闭
从 读取文本文件 章节可知,一般情况操作完文件后,应及时关闭
关闭后,将内存中的 数据 立刻 写入 文件中,解释见下面写入文件
f.close()
异常处理
异常处理同读取文件操作,try...finally...和with语句都适用
写入文件
写入是将 内存 中的数据保存在 硬盘 中
写入文件主要有两种方法
方法1
将数据写入文件
len=write(data)
参数
data:要写入文件的数据,二进制字节序列,如bytes等
返回值
返回的是写入的长度,以字节为单位。
例子1:
通过 二进制 模式,将字符串“长风破浪会有时【换行】直挂云帆济沧海”写入文件,代码如下:
with open('c:/users/mym/desktop/6.txt','wb') as f:
len=f.write('长风破浪会有时\r\n直挂云帆济沧海')
print(len)
报错如下:
TypeError: a bytes-like object is required, not 'str'
类型错误,应该类似bytes类型的数据
例子2:
改造上面的程序,调用str的 encode()方法,将字符串编码为bytes类型,采用GBK编码,如下:
with open('c:/users/mym/desktop/6.txt','wb') as f:
len=f.write('长风破浪会有时\r\n直挂云帆济沧海'.encode('GBK'))
print(len)
执行结果如下:
30
在GBK编码中,一个汉字占2个字节,所以写14个汉字是28个字节,在加上换行符\r\n两个字节,一共是30个字节
换行符
用 二进制 模式写入文本文件时,我们要自己写换行符的原始码,在UNIX、linux中的换行符是\n,在windows中换行符是\r\n,各家系统的换行符可能不同,所以要我们自己根据系统写换行符
例子2
上面例子,直接将换行符 写在代码 中,不利于 跨平台
比如:在windows系统上开发,将换行符\r\n写在代码中,但在运行时,可能是在linux系统中,那么写入文件时还是\r\n,与linux系统不符(linux的换行符是\n),可能会出现错误
改造上面的程序,动态获取换行符,如下:
import os
with open('c:/users/mym/desktop/6.txt','wb') as f:
s='长风破浪会有时'+os.linesep+'直挂云帆济沧海'
len=f.write(s.encode('GBK'))
print(len)
方法2(不报错,不推荐)
将序列中的字符串写入到文件,序列必须 全是字符串,如:list、dict等
writelines( [ str ])
参数
str:要写入文件的字符串序列
返回值
无
flush()
刷新缓冲区,将 缓冲区中 的数据立刻 写入 文件中
f.flush()
例子import time
with open('c:/users/mym/desktop/2.txt','wb') as f:
f.write('白日依山尽\n黄河入海流\n')
f.flush()
f.write('欲穷千里目\n更上一层楼\n')
time.sleep(10)
休眠10秒,在10秒内,打开文件,可以看到下面内容:
白日依山尽
黄河入海流
因为执行了flush()方法刷新缓冲区,写入文件。10秒后执行结束,再次将缓冲区中的数据写入文件中,最后结果如下:
白日依山尽
黄河入海流
欲穷千里目
更上一层楼
移动文件指针
从读取二进制文件章节可知,写入带有中文的文本文件时,移动指针可能会造成错误,所以,处理中文文本文件时,一般不要将文件指针移动到文件中间位置。移动到头部不会造成错误