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中的Queue与多进程
Aug 25 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
python3操作微信itchat实现发送图片
Feb 24 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
python模拟表单提交登录图书馆
Apr 27 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
如何理解及使用Python闭包
Jun 01 Python
Python实现简单的俄罗斯方块游戏
Sep 25 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 购物车实例(申精)
2009/05/11 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
php中strtotime函数用法详解
2014/11/15 PHP
phplot生成图片类用法详解
2015/01/06 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
js实现开关灯效果
2020/03/30 Javascript
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
python操作ie登陆土豆网的方法
2015/05/09 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
python和go语言的区别是什么
2020/07/20 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
python drf各类组件的用法和作用
2021/01/12 Python
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
小学生获奖感言范文
2014/02/02 职场文书
一年级学生评语
2014/04/23 职场文书
工地质量标语
2014/06/12 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
语文教师个人工作总结
2015/02/06 职场文书
Go语言 详解net的tcp服务
2022/04/14 Golang