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
相关产品推荐
相关产品推荐

