使用Python进行二进制文件读写的简单方法(推荐)


Posted in Python onSeptember 12, 2016

总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。

python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。

import struct

a=12.34

#将a变为二进制

bytes=struct.pack('i',a)

此时bytes就是一个string字符串,字符串按字节同a的二进制存储内容相同。

再进行反操作

现有二进制数据bytes,(其实就是字符串),将它反过来转换成python的数据类型:

a,=struct.unpack('i',bytes)

注意,unpack返回的是tuple

所以如果只有一个变量的话:

bytes=struct.pack('i',a)

那么,解码的时候需要这样

a,=struct.unpack('i',bytes) 或者 (a,)=struct.unpack('i',bytes)

如果直接用a=struct.unpack('i',bytes),那么 a=(12.34,) ,是一个tuple而不是原来的浮点数了。

如果是由多个数据构成的,可以这样:

a='hello'

b='world!'

c=2

d=45.123

bytes=struct.pack('5s6sif',a,b,c,d)

此时的bytes就是二进制形式的数据了,可以直接写入文件比如 binfile.write(bytes)

然后,当我们需要时可以再读出来,bytes=binfile.read()

再通过struct.unpack()解码成python变量

a,b,c,d=struct.unpack('5s6sif',bytes)

'5s6sif'这个叫做fmt,就是格式化字符串,由数字加字符构成,5s表示占5个字符的字符串,2i,表示2个整数等等,下面是可用的字符及类型,ctype表示可以与python中的类型一一对应。

Format C Type Python 字节数
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or long 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long

最后一个可以用来表示指针类型的,占4个字节

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而还提供了

Character Byte order Size and alignment
@ native native            凑够4个字节
= native standard        按原字节数
little-endian standard        按原字节数
> big-endian standard       按原字节数
! network (= big-endian) standard       按原字节数

使用方法是放在fmt的第一个位置,就像'@5s6sif'

-----二进制文件处理时会碰到的问题-----

我们使用处理二进制文件时,需要用如下方法

binfile=open(filepath,'rb')    读二进制文件

binfile=open(filepath,'wb')    写二进制文件

那么和binfile=open(filepath,'r')的结果到底有何不同呢?

不同之处有两个地方:

第一,使用'r'的时候如果碰到'0x1A',就会视为文件结束,这就是EOF。使用'rb'则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在'0X1A',就只会读出文件的一部分。使用'rb'的时候会一直读到文件末尾。

第二,对于字符串x='abc/ndef',我们可用len(x)得到它的长度为7,/n我们称之为换行符,实际上是 '0X0A'。当我们用'w' 即文本方式写的时候,在windows平台上会自动将'0X0A'变成两个字符'0X0D','0X0A',即文件长度实际上变成8.。当用'r'文本方式读取时,又自动的转换成原来的换行符。如果换成'wb'二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。'0X0D'又称回车符。
linux下不会变。因为linux只使用'0X0A'来表示换行。

以上这篇使用Python进行二进制文件读写的简单方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
收集的几个Python小技巧分享
Nov 22 Python
Python中生成器和yield语句的用法详解
Apr 17 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
详解Python多线程下的list
Jul 03 Python
浅谈Django前端后端值传递问题
Jul 15 Python
python之语音识别speech模块
Sep 09 Python
浅谈python对象数据的读写权限
Sep 12 #Python
python获取list下标及其值的简单方法
Sep 12 #Python
Python循环语句中else的用法总结
Sep 11 #Python
python字典键值对的添加和遍历方法
Sep 11 #Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 #Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 #Python
python 循环遍历字典元素的简单方法
Sep 11 #Python
You might like
Zend的MVC机制使用分析(二)
2013/05/02 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python中定义结构体的方法
2013/03/04 Python
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
PyQt5实现拖放功能
2018/04/25 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python绘制漏斗图步骤详解
2019/03/04 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
opencv实现简单人脸识别
2021/02/19 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
python第三方库学习笔记
2020/02/07 Python
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
办公室前台岗位职责
2014/01/04 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
2014年母亲节寄语
2014/05/07 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
赢在中国观后感
2015/06/02 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏