python之写入二进制文件

概述

计算机都是以二进制存储文件的,如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),可能会出现错误

通过 os模块 获取系统换行符,见下面链接:
http://www.malaoshi.top/show_1EF2Q155hwJ9.html

改造上面的程序,动态获取换行符,如下:

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秒后执行结束,再次将缓冲区中的数据写入文件中,最后结果如下:

白日依山尽
黄河入海流
欲穷千里目
更上一层楼

移动文件指针

从读取二进制文件章节可知,写入带有中文的文本文件时,移动指针可能会造成错误,所以,处理中文文本文件时,一般不要将文件指针移动到文件中间位置。移动到头部不会造成错误

感谢:
http://www.runoob.com/python/python-files-io.html


原文出处:/show_1EF2PbRmHWiJ.html