使用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访问抓取网页常用命令总结
Apr 11 Python
python实现发送邮件功能代码
Dec 14 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
Python实现的简单排列组合算法示例
Jul 04 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
python中的错误如何查看
Jul 08 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
Aug 05 Python
详解numpy1.19.4与python3.9版本冲突解决
Dec 15 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
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
js树形控件脚本代码
2008/07/24 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
Python实现选择排序
2017/06/04 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
如何利用python查找电脑文件
2018/04/27 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
Python3标准库总结
2019/02/19 Python
python3下pygame如何实现显示中文
2020/01/11 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
python文件及目录操作代码汇总
2020/07/08 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
大学本科生的个人自我评价
2013/12/09 职场文书
廉政承诺书
2015/01/19 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
卖车协议书范文
2016/03/23 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
Python操作CSV格式文件的方法大全
2021/07/15 Python