Python中bytes转字符串写入CSV后读取如何还原为原始二进制字节
问题场景
- 写入逻辑:将十六进制构造的
bytes类型字节串直接转字符串后写入CSV文件 - 读取问题:用pandas读取CSV后,原字节串变为带
b前缀、两侧带引号的普通字符串,和原始bytes对象做相等校验返回False,尝试用ctypes.fromhex转换时触发ValueError
复现代码:
import pandas as pd # 写入阶段 bstring = b"\x0F\xC8\x3F\x7C\x00" to_write = 'bstrings\n' to_write += str(bstring) with open('test.csv', "w") as f_csv: f_csv.write(to_write) # 读取阶段 my_df = pd.read_csv('test.csv') bstring2 = my_df['bstrings'][0] print(bstring) print(type(bstring)) print(bstring2) print(type(bstring2)) print(bstring == bstring2)
运行输出:
b'\x0f\xc8?|\x00' <class 'bytes'> b'\x0f\xc8?|\x00' <class 'str'> False
修复方案
不要手动裁剪字符串去掉b前缀和引号,很容易漏处理转义字符、可打印字节的特殊情况。直接用Python标准库ast的literal_eval方法解析即可,这个方法本来就是用来安全解析Python原生字面量表达式的,能完美识别这种bytes字面量格式的字符串,一步还原原始对象。
转换代码:
import ast # 还原为原始bytes对象 bstring_restored = ast.literal_eval(bstring2) # 校验结果 print(bstring_restored == bstring) # 输出 True print(type(bstring_restored)) # 输出 <class 'bytes'>
为什么ctypes.fromhex会报错
你读到的bstring2不是纯十六进制字符串:它包含bytes字面量前缀b、包裹内容的引号,同时部分可打印ASCII字节会直接显示为字符(比如例子里的?对应原字节\x3f、|对应原字节\x7c),不符合fromhex要求的纯十六进制字符输入格式,自然会触发ValueError。
长期优化建议
如果后续需要在CSV中存储二进制字节内容,不要直接str(bytes对象)写入,更推荐:
- 写入时调用bytes对象的
.hex()方法,转成纯十六进制字符串存到CSV - 读取时调用
bytes.fromhex(读取到的字符串)即可还原
这种方式不需要解析Python字面量格式,跨工具、跨版本的兼容性更好,不会出现转义字符解析异常的问题。
内容的提问来源于stack exchange,提问作者gdelab
相关产品推荐
相关产品推荐

