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中由于logging模块误用导致的内存泄露
Apr 23 Python
详解python Todo清单实战
Nov 01 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
Python函数参数类型及排序原理总结
Dec 19 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
python中for in的用法详解
Apr 17 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
Python max函数中key的用法及原理解析
Jun 26 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输出表格的实现代码(修正版)
2010/12/29 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
jquery delay()介绍及使用指南
2014/09/02 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
基于JSONP原理解析(推荐)
2017/12/04 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
js实现简单贪吃蛇游戏
2020/05/15 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python实现按任意键继续执行程序
2016/12/30 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
如何使用python代码操作git代码
2020/02/29 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
党员年终民主评议的自我评价
2013/11/05 职场文书
行政部总经理岗位职责
2014/01/04 职场文书
公司门卫管理制度
2014/02/01 职场文书
社区安全检查制度
2014/02/03 职场文书
2014庆六一活动方案
2014/03/02 职场文书
美术社团活动总结
2014/06/27 职场文书
优秀会计求职信
2014/07/04 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
旷课检讨书范文
2015/01/27 职场文书
通知的写法
2015/04/23 职场文书