Python读写二进制文件的实现
作者:大作家佚名 发布时间:2023-07-20 14:48:52
标签:Python,二进制文件
1. 简介
Python 读写文件的二进制数据需要使用到struct模块,进行C/C++与Python数据格式的转换。
2. struct模块介绍
struct模块中最常用的函数为pack和unpack,用法如下:
函数 | return | explain |
---|---|---|
pack(fmt,v1,v2…) | string | 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. |
pack_into(fmt,buffer,offset,v1,v2…) | None | 按照给定的格式(fmt),将数据转换成字符串(字节流),并将字节流写入以offset开始的buffer中.(buffer为可写的缓冲区,可用array模块) |
unpack(fmt,v1,v2……) | tuple | 按照给定的格式(fmt)解析字节流,并返回解析结果 |
pack_from(fmt,buffer,offset) | tuple | 按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果 |
calcsize(fmt) | size of fmt | 计算给定的格式(fmt)占用多少字节的内存,注意对齐方式 |
3. struct模块中数据格式fmt对应C/C++和Python中的类型
Format | C Type | Python type | Standard size |
---|---|---|---|
x | pad byte | no value | |
c | char | string of length | 1 |
b | signed char | integer | 1 |
B | unsigned char | integer | 1 |
? | _Bool | bool | 1 |
h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | integer | 4 |
I | unsigned int | integer | 4 |
l | long | integer | 4 |
L | unsigned long | integer | 4 |
q | long long | integer | 8 |
Q | unsigned long long | integer | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | char[] | string | |
p | char[] | string | |
P | void * | integer |
4. 实例
注意:代码中,<表示小端,>表示大端
import struct
# 打开文件
with open("binary_file.bin", "wb") as f:
# 写入4个字节的整数(值为12345)
int_value = 12345
f.write(struct.pack("<i", int_value))
# 写入8个字节的双精度浮点数(值为3.14159)
double_value = 3.14159
f.write(struct.pack("<d", double_value))
# 写入一个字节的布尔值(值为True)
bool_value = True
f.write(struct.pack("<?", bool_value))
# 写入一个定长字符串(10个字符,值为"hello")
string_value = "hello".encode("utf-8")
f.write(struct.pack("<5s", string_value))
# 写入一个定长字节数组(20个字节,值为b"\x01\x02\x03...\x14")
byte_array_value = bytes(range(1, 21))
f.write(struct.pack("<20s", byte_array_value))
f.close()
# 打开文件
with open("binary_file.bin", "rb") as f:
# 读取4个字节,解析成一个整数
int_value = struct.unpack("<i", f.read(4))[0]
# 读取8个字节,解析成一个双精度浮点数
double_value = struct.unpack("<d", f.read(8))[0]
# 读取一个字节,解析成一个布尔值
bool_value = struct.unpack("<?", f.read(1))[0]
# 读取一个字符串,解析成一个定长字符串(10个字符)
string_value = struct.unpack("<5s", f.read(5))[0].decode("utf-8")
# 读取一个字节数组,解析成一个定长字节数组(20个字节)
byte_array_value = struct.unpack("<20s", f.read(20))[0]
# 打印结果
print(f"int_value: {int_value}")
print(f"double_value: {double_value}")
print(f"bool_value: {bool_value}")
print(f"string_value: {string_value}")
print(f"byte_array_value: {byte_array_value}")
f.close()
5. Python 字符串前面加u,r,b,f的含义
5.1. 字符串前加u
后面字符串以 Unicode格式进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
str= u'hello'
5.2. 字符串前加r
去掉反斜杠的转移机制。(特殊字符:即那些,反斜杠加上对应字母,表示对应的特殊含义的,比如最常见的”\n”表示换行,”\t”表示Tab等。 )
str= r'hello\n\t\n'
5.3. 字符串前加b
表示该字符串是bytes 类型。
bytes = b'hello'
在 Python3 中,bytes 和 str 的互相转换方式是
str.encode(‘utf-8')
bytes.decode(‘utf-8')
5.4. 字符串前加f
以 f 开头表示在字符串内支持大括号内的python 表达式,字符串拼接
name = 'Lily'
print(f'My name is {name}.')
参考
[1] python3中的struct模块使用
[2] Python 字符串前面加u,r,b,f的含义
来源:https://blog.csdn.net/wokaowokaowokao12345/article/details/130111131


猜你喜欢
- 一空间多域名绑定3种方法,HTML代码格式:<html> <script language=javascript
- 背景在某些场景下,我们可能会大量的使用字节数组,比如IO操作、编解码,如果不进行优化,大量的申请和释放字节数组会造成一定的性能损耗,因此有必
- # 基础版,不依赖环境import timeimport base64import hashlibclass Token_hander():
- 本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下一、CNN模型结构输入层:
- 下面通过文字说明和代码分析的方式给大家分享移动端图片上传之localResizeIMG先压缩后ajax无刷新上传,具体实现过程请看下文。现在
- MySQL ERROR 1045 (28000): Access denied for user 'root'@'l
- 获取指定日期月份的第一天,你可以使用DATEADD函数,减去指定日期的月份过去了的天数,即可。 代码如下:CREATE FUNC
- 本文实例讲述了Python模块的制作方法。分享给大家供大家参考,具体如下:1 目的利用setup.py将框架安装到python环境中,作为第
- 字符串和切片(string and slice)string底层就是一个byte的数组,因此,也可以进行切片操作。package maini
- 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持。1、定时任务定时任务,顾名思义: 定时执行的任
- 目录1.列表的介绍2.打印出列表的数据1.我们可以根据下标取值进行打印2.使用for循环遍历3.使用while循环遍历3.列表的添加操作1.
- 本文实例为大家分享了java模拟ATM功能的具体代码,供大家参考,具体内容如下有三个类:Test.java、Customer.java、Cu
- 修改配置文件:vim /usr/local/php/etc/php.ini[Phar]phar.readonly = Off压缩:a. 创建
- 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了。。。感觉应该刷一波Leecode冷静下。。。今天抽空看下。题目就是要求O(
- 本节重点掌握Cpython的GIL解释器锁的工作机制掌握GIL与互斥锁掌握Cpython下多线程与多进程各自的应用场景本节时长需控制在45分
- GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。1、概述“Group By”从字面意义上理解就是根据“By”指定的
- 1.物体识别本案例实现对特殊颜色物体的识别,并实现根据物体位置的改变进行控制跟随。import cv2 as cv# 定义结构元素kerne
- 就是一个简单的python查询百度关键词排名的函数,以下是一些简介:1、UA随机2、操作简单方便,直接getRank(关键词,域名)就可以了
- 前言:Python 自带了很多的内置函数,极大地方便了我们的开发,下面就来挑几个内置函数,看看底层是怎么实现的。内置函数位于 Python/
- 一、参数和共享引用:In [56]: def changer(a,b): ....: a=2 ....