Python分别使用pickle和struct写入和读取二进制文件
时间: 2024-02-28 11:55:53 浏览: 167
使用Python标准库中的`pickle`和`struct`模块,可以方便地将Python对象序列化为二进制数据并写入文件,或者从文件中读取二进制数据并反序列化为Python对象。
下面是一个示例代码,演示如何使用`pickle`和`struct`模块,分别写入和读取二进制文件:
```python
import pickle
import struct
# 定义一个Python对象
data = {'name': 'Alice', 'age': 18, 'gender': 'female'}
# 使用pickle模块写入二进制文件
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)
# 使用pickle模块读取二进制文件
with open('data.pickle', 'rb') as f:
data = pickle.load(f)
print(data)
# 使用struct模块写入二进制文件
with open('data.bin', 'wb') as f:
# 将字符串按照UTF-8编码转换为二进制数据,并写入文件
name_data = data['name'].encode('utf-8')
f.write(struct.pack('<i', len(name_data)))
f.write(name_data)
# 将整数按照4字节的整数格式打包成二进制数据,并写入文件
f.write(struct.pack('<i', data['age']))
# 将字符串按照UTF-8编码转换为二进制数据,并写入文件
gender_data = data['gender'].encode('utf-8')
f.write(struct.pack('<i', len(gender_data)))
f.write(gender_data)
# 使用struct模块读取二进制文件
with open('data.bin', 'rb') as f:
# 读取字符串的长度,并解析为整数
name_length = struct.unpack('<i', f.read(4))[0]
# 读取字符串的二进制数据,并解码为字符串
name_data = f.read(name_length)
name = name_data.decode('utf-8')
# 读取整数数据
age = struct.unpack('<i', f.read(4))[0]
# 读取字符串的长度,并解析为整数
gender_length = struct.unpack('<i', f.read(4))[0]
# 读取字符串的二进制数据,并解码为字符串
gender_data = f.read(gender_length)
gender = gender_data.decode('utf-8')
# 将读取到的数据组成Python对象
data = {'name': name, 'age': age, 'gender': gender}
print(data)
```
在上述示例代码中,我们首先定义了一个Python对象`data`,包含了一个字符串、一个整数和一个字符串。然后使用`pickle`模块将该对象序列化为二进制数据,并写入文件`data.pickle`中。接着使用`pickle`模块读取该文件,并反序列化为Python对象,输出到控制台。
然后使用`struct`模块将Python对象`data`中的数据按照指定格式转换为二进制数据,并写入文件`data.bin`中。在写入过程中,我们先将字符串按照UTF-8编码转换为二进制数据,并在数据前面加上一个整数,表示字符串的长度。然后将整数按照4字节的整数格式打包成二进制数据写入文件。最后再将另一个字符串按照同样的方式写入文件。
接着使用`struct`模块读取文件`data.bin`,依次读取字符串的长度、字符串的二进制数据、整数数据和另一个字符串的长度、字符串的二进制数据,并解析为Python对象。最后输出到控制台。
阅读全文