使用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新手经常遇到的17个错误分析
Jul 30 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
python中range()与xrange()用法分析
Sep 21 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
50行Python代码实现人脸检测功能
Jan 23 Python
pandas修改DataFrame列名的方法
Apr 08 Python
pandas or sql计算前后两行数据间的增值方法
Apr 20 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP封装的HttpClient类用法实例
2015/06/17 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
virtualenv实现多个版本Python共存
2017/08/21 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
python数据封装json格式数据
2018/03/04 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
机械设计及其自动化专业推荐信
2013/10/31 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
市优秀教师事迹材料
2014/02/05 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
服务整改报告
2014/11/06 职场文书
个人廉洁自律总结
2015/03/06 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL