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中装饰器的使用
Jul 12 Python
python3中int(整型)的使用教程
Mar 23 Python
python实现12306火车票查询器
Apr 20 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
python3爬取淘宝信息代码分析
Feb 10 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
20行python代码实现人脸识别
May 05 Python
如何安装并使用conda指令管理python环境
Jul 10 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
python opencv实现信用卡的数字识别
Jan 12 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 Python
python 判断文件或文件夹是否存在
Mar 18 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
德劲1107的电路分析与打磨
2021/03/02 无线电
PHP脚本数据库功能详解(上)
2006/10/09 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
extjs之去除s.gif的影响
2010/12/25 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
python中abs&map&reduce简介
2018/02/20 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
学校端午节活动方案
2014/08/23 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技
关于mysql中string和number的转换问题
2022/06/14 MySQL
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers