Python如何读写字节数据


Posted in Python onAugust 05, 2020

问题

你想读写二进制文件,比如图片,声音文件等等。

解决方案

使用模式为 rb 或 wb 的 open() 函数来读取或写入二进制数据。比如:

# Read the entire file as a single byte string
with open('somefile.bin', 'rb') as f:
  data = f.read()

# Write binary data to a file
with open('somefile.bin', 'wb') as f:
  f.write(b'Hello World')

在读取二进制数据时,需要指明的是所有返回的数据都是字节字符串格式的,而不是文本字符串。 类似的,在写入的时候,必须保证参数是以字节形式对外暴露数据的对象(比如字节字符串,字节数组对象等)。

讨论

在读取二进制数据的时候,字节字符串和文本字符串的语义差异可能会导致一个潜在的陷阱。 特别需要注意的是,索引和迭代动作返回的是字节的值而不是字节字符串。比如:

>>> # Text string
>>> t = 'Hello World'
>>> t[0]
'H'
>>> for c in t:
...   print(c)
...
H
e
l
l
o
...
>>> # Byte string
>>> b = b'Hello World'
>>> b[0]
72
>>> for c in b:
...   print(c)
...
72
101
108
108
111
...
>>>

如果你想从二进制模式的文件中读取或写入文本数据,必须确保要进行解码和编码操作。比如:

with open('somefile.bin', 'rb') as f:
  data = f.read(16)
  text = data.decode('utf-8')

with open('somefile.bin', 'wb') as f:
  text = 'Hello World'
  f.write(text.encode('utf-8'))

二进制I/O还有一个鲜为人知的特性就是数组和C结构体类型能直接被写入,而不需要中间转换为自己对象。比如:

import array
nums = array.array('i', [1, 2, 3, 4])
with open('data.bin','wb') as f:
  f.write(nums)

这个适用于任何实现了被称之为”缓冲接口”的对象,这种对象会直接暴露其底层的内存缓冲区给能处理它的操作。 二进制数据的写入就是这类操作之一。

很多对象还允许通过使用文件对象的 readinto() 方法直接读取二进制数据到其底层的内存中去。比如:

>>> import array
>>> a = array.array('i', [0, 0, 0, 0, 0, 0, 0, 0])
>>> with open('data.bin', 'rb') as f:
...   f.readinto(a)
...
16
>>> a
array('i', [1, 2, 3, 4, 0, 0, 0, 0])
>>>

但是使用这种技术的时候需要格外小心,因为它通常具有平台相关性,并且可能会依赖字长和字节顺序(高位优先和低位优先)。

以上就是Python如何读写字节数据的详细内容,更多关于Python读写字节数据的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
九步学会Python装饰器
May 09 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
Python datetime模块使用方法小结
Jun 18 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
Jul 01 Python
Python json格式化打印实现过程解析
Jul 21 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 Python
python中Django文件上传方法详解
Aug 05 #Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 #Python
Python如何将将模块分割成多个文件
Aug 04 #Python
Python 保存加载mat格式文件的示例代码
Aug 04 #Python
python中判断文件结束符的具体方法
Aug 04 #Python
python字典key不能是可以是啥类型
Aug 04 #Python
Python延迟绑定问题原理及解决方案
Aug 04 #Python
You might like
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
php实现socket推送技术的示例
2017/12/20 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
python下载文件时显示下载进度的方法
2015/04/02 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
python如何使用unittest测试接口
2018/04/04 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
python实现键盘输入的实操方法
2019/07/16 Python
python爬虫 正则表达式解析
2019/09/28 Python
基于Python实现扑克牌面试题
2019/12/11 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
七年级数学教学反思
2014/01/22 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
会议通知格式范文
2015/04/15 职场文书
2015年教师节广播稿
2015/08/19 职场文书