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中__name__的使用实例
Apr 14 Python
Python选课系统开发程序
Sep 02 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
python 脚本生成随机 字母 + 数字密码功能
May 26 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
Python selenium的基本使用方法分析
Dec 21 Python
Python使用for生成列表实现过程解析
Sep 22 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 Python
python实现计算图形面积
Feb 22 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
SONY ICF-F10中波修复记
2021/03/02 无线电
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
重定向实现代码
2006/11/20 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
使用nodejs中httpProxy代理时候出现404异常的解决方法
2016/08/15 NodeJs
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
使用Python的PIL模块来进行图片对比
2016/02/18 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
python 异或加密字符串的实例
2018/10/14 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
青年文明号汇报材料
2014/12/23 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
OpenFeign实现远程调用
2022/08/14 Java/Android