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 从远程服务器下载日志文件的程序
Feb 10 Python
python列表与元组详解实例
Nov 01 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
详解supervisor使用教程
Nov 21 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
Python3实现的判断回文链表算法示例
Mar 08 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
pytorch数据预处理错误的解决
Feb 20 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 Python
python:解析requests返回的response(json格式)说明
Apr 30 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 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源码之explode使用说明
2011/08/05 PHP
php自动注册登录验证机制实现代码
2011/12/20 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
php实用代码片段整理
2016/11/12 PHP
告诉大家什么是JSON
2008/06/10 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
Dojo 学习要点
2010/09/03 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
如何开发安全的AJAX应用
2014/03/26 面试题
应聘医学检验人员自荐信
2013/09/27 职场文书
2014升学宴答谢词
2014/01/26 职场文书
工厂会计员职责
2014/02/06 职场文书
微笑服务演讲稿
2014/05/13 职场文书
2014年车间工作总结
2014/11/21 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
Redis入门教程详解
2021/08/30 Redis