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 Django(图文)
Nov 04 Python
python实现进程间通信简单实例
Jul 23 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
python实现可逆简单的加密算法
Mar 22 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 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 IN_ARRAY 函数使用注意事项
2010/07/24 PHP
JavaScript之引用类型介绍
2012/08/10 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
python属于解释型语言么
2020/06/15 Python
python爬虫---requests库的用法详解
2020/09/28 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
网络程序员自荐信
2014/01/25 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
我爱我校演讲稿
2014/05/21 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
Python中for后接else的语法使用
2021/05/18 Python
JVM之方法返回地址详解
2022/02/28 Java/Android
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python