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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:48:15