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

Python如何将CSV中字符串格式字节字面量转为可反序列化的bytes对象

解决方法

核心思路

你读取到的d[1]是字符串形式的Python字节字面量,本质是把bytes对象的repr结果存到了CSV里,需要先把这个文本字面量解析为真实的bytes对象,再做反序列化。

实现代码

import csv
from os.path import join, getcwd
import ast
import pickle

filePath = join(getcwd(),'src','data','history.csv')
data = []
with open(filePath, mode='r') as fp:
    histCSV = csv.reader(fp)
    for line in histCSV:
        # 忽略空行和表头
        if line:
            data.append(line)
    # 读取最近5条记录
    for d in data[-1:-5:-1]:
        expr = d[0]
        ans_str = d[1]
        # 第一步:解析字符串字面量为真实bytes对象
        ans_bytes = ast.literal_eval(ans_str)
        # 第二步:反序列化得到原始Python对象
        original_obj = pickle.loads(ans_bytes)
        # 后续业务逻辑

方案说明

  • 优先使用ast.literal_eval:这是Python官方提供的安全字面量解析方法,只会解析Python基础类型的字面量(字符串、字节、数字、列表、元组、字典等),不会执行任意代码,比直接用eval安全很多,完全适配你当前的场景。
  • 备选手动处理方案:如果确认所有字节字面量的格式固定为b'xxx',也可以手动切片转码实现,兼容性稍差:
    ans_bytes = ans_str[2:-1].encode('raw_unicode_escape')
    

优化建议

后续存序列化结果到CSV时,可以先把bytes对象用base64编码为纯ASCII字符串再存储,读取后解码即可,避免字面量解析的潜在问题:

# 存储时示例
import base64
serialized_bytes = pickle.dumps(你的对象)
serialized_str = base64.b64encode(serialized_bytes).decode('ascii')
# 读取时示例
serialized_bytes = base64.b64decode(serialized_str)
original_obj = pickle.loads(serialized_bytes)

内容的提问来源于stack exchange,提问作者Prithvi singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:04