如何将pickle.dumps()输出转为字符串并还原为字节流?
解决Pickle字节流与字符串互转的问题
问题核心
pickle.dumps()输出的是字节流,直接转UTF-8字符串会因为包含非UTF-8兼容字节导致信息丢失,无法还原。必须用无损的字节转字符串编码方式,比如Base64——它能把任意字节转成ASCII字符串,完全兼容UTF-8文件。
实现步骤
1. 将Pickle字节流转为字符串(编码)
用base64.b64encode()把字节流转成Base64编码的字节,再decode成ASCII字符串,这样就能安全保存到UTF-8文件中。
修改你的代码示例:
import pickle import base64 import random import os class SomeClass: def __init__(self): self.thing = random.randint(5,15) self.thing2 = str(os.urandom(16)) self.thing3 = random.randint(1,10) self.thing4 = "You get the idea" a_list = [SomeClass() for _ in range(5)] # 把pickle字节流转为Base64字符串 pickle_bytes = pickle.dumps(a_list) pickle_str = base64.b64encode(pickle_bytes).decode('ascii') # 保存到UTF-8文件 with open('pickle_data.txt', 'w', encoding='utf-8') as f: f.write(pickle_str)
2. 将字符串还原为Pickle可读取的字节流(解码)
读取文件中的Base64字符串,用base64.b64decode()转成字节流,再用pickle.loads()还原对象。
示例代码:
import pickle import base64 # 从UTF-8文件读取字符串 with open('pickle_data.txt', 'r', encoding='utf-8') as f: pickle_str = f.read() # 还原为字节流并加载对象 pickle_bytes = base64.b64decode(pickle_str) restored_list = pickle.loads(pickle_bytes) # 验证还原结果 for obj in restored_list: print(obj.thing, obj.thing3)
为什么Base64可行?
Base64用64个可打印ASCII字符表示任意字节,不会产生UTF-8无法处理的字符,保存和读取过程完全无损,是字节与字符串互转的标准方案之一。
内容的提问来源于stack exchange,提问作者WinFan3672
相关产品推荐
相关产品推荐

