You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:42:50