使用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中将字典转换成其json字符串
Jul 16 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python多个模块py文件的数据共享实例
Jan 11 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
Django DRF路由与扩展功能的实现
Jun 03 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
Django跨域请求原理及实现代码
Nov 14 Python
Pytorch实验常用代码段汇总
Nov 19 Python
python3 kubernetes api的使用示例
Jan 12 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
PHP中如何定义和使用常量
2013/02/28 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Promise扫盲贴
2019/06/24 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python对象转JSON字符串的方法
2016/04/27 Python
Python rstrip()方法实例详解
2018/11/11 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
开会通知
2015/04/20 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书