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每次处理固定个数的字符的方法总结
Jan 29 Python
Python实现测试磁盘性能的方法
Mar 12 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
浅析python协程相关概念
Jan 20 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
Python实现检测文件的MD5值来查找重复文件案例
Mar 12 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 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
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
PHP 文件系统详解
2012/09/13 PHP
php批量上传的实现代码
2013/06/09 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
php时间戳转换代码详解
2019/08/04 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
日期 时间js控件
2009/05/07 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
浅析return false的正确使用
2013/11/04 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
python能否java成为主流语言吗
2020/06/22 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
中专生自我鉴定书范文
2013/12/28 职场文书
优秀护士获奖感言
2014/02/20 职场文书
车队司机自我鉴定
2014/03/02 职场文书
合作协议书怎么写
2014/04/18 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android