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在linux中输出带颜色的文字的方法
Jun 19 Python
Python使用multiprocessing创建进程的方法
Jun 04 Python
Unicode和Python的中文处理
Mar 19 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
Python函数返回不定数量的值方法
Jan 22 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
使用Python将语音转换为文本的方法
Aug 10 Python
Python+tkinter实现高清图片保存
Mar 13 Python
Python中的socket网络模块介绍
Jul 23 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php实现登陆模块功能示例
2016/10/20 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
简介JavaScript错误处理机制
2020/08/04 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
Python实现字符串格式化输出的方法详解
2017/09/20 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
车辆转让协议书
2014/04/15 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
费城故事观后感
2015/06/10 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers