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实现划词翻译
Apr 23 Python
python的三目运算符和not in运算符使用示例
Mar 03 Python
python改变日志(logging)存放位置的示例
Mar 27 Python
python中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
python在openstreetmap地图上绘制路线图的实现
Jul 11 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 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 file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
js实现图片360度旋转
2017/01/22 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
Django返回json数据用法示例
2016/09/18 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python3实现磁盘空间监控
2018/06/21 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
python入门之基础语法学习笔记
2020/02/08 Python
Python如何根据时间序列数据作图
2020/05/12 Python
基于python代码批量处理图片resize
2020/06/04 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
Jar包的作用是什么
2014/03/30 面试题
医院总经理职责
2013/12/26 职场文书
会计自我鉴定
2014/02/04 职场文书
未婚证明书模板
2014/10/08 职场文书
个人党性分析材料
2014/12/19 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL