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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
python从入门到精通(DAY 2)
Dec 20 Python
Python中super函数的用法
Nov 17 Python
python smtplib模块实现发送邮件带附件sendmail
May 22 Python
对Python3+gdal 读取tiff格式数据的实例讲解
Dec 04 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
NumPy 数组使用大全
Apr 25 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
Python配置文件处理的方法教程
Aug 29 Python
Django URL参数Template反向解析
Nov 24 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之第九天
2006/10/09 PHP
PHP 文件上传全攻略
2010/04/28 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
浅谈function(函数)中的动态参数
2017/04/30 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
浅析python实现动态规划背包问题
2020/12/31 Python
python链表类中获取元素实例方法
2021/02/23 Python
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
班主任工作经验材料
2014/02/02 职场文书
函授药学自我鉴定
2014/02/07 职场文书
小学教师评语大全
2014/04/23 职场文书
师德师风个人反思
2014/04/28 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
交通志愿者活动总结
2014/06/27 职场文书
作风转变年心得体会
2014/10/22 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
毕业生评语大全
2015/01/04 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android