Pandas读写CSV后字节串变为带b前缀字符串的解决方案问询
解决方案
问题根因:CSV为纯文本格式,不支持原生存储二进制字节类型,Pandas写入时会自动将字节对象转为带b''标识的repr字符串,读取时即使指定dtype=bytes也只会将整段字符串转为字节,因此会出现b"b'hey'"的双层前缀问题。以下是三种无需手动去除b前缀的可行方案:
方案1:使用ast字面量解析(适用于必须使用CSV的场景)
利用ast.literal_eval安全解析字符串形式的Python字面量,直接将"b'hey'"格式的字符串转为原生字节对象:
import pandas as pd import ast # 读取CSV后处理目标列 df = pd.read_csv("your_file.csv") df["COLUMN_NAME"] = df["COLUMN_NAME"].apply(ast.literal_eval)
该方案无需修改写入逻辑,仅需在读取后增加一行处理,自动适配所有合法的字节字面量格式,包括带转义字符的字节串。
方案2:Base64编码转码(适用于必须使用CSV、且字节内容存在特殊字符的场景)
写入前将字节串转为Base64编码的纯ASCII字符串,读取后再解码回字节,完全规避repr字符串的解析问题:
import pandas as pd import base64 # 写入前处理 df["COLUMN_NAME"] = df["COLUMN_NAME"].apply(base64.b64encode).str.decode("ascii") df.to_csv("your_file.csv", index=False) # 读取后处理 df = pd.read_csv("your_file.csv") df["COLUMN_NAME"] = df["COLUMN_NAME"].apply(base64.b64decode)
方案3:更换为支持二进制类型的存储格式(最优方案,无需额外转换)
如果业务允许不使用CSV,直接选择Parquet、Pickle等支持原生存储二进制类型的格式,读写全程不需要做额外字段处理,也不会出现类型丢失问题:
import pandas as pd # 写入Parquet格式 df.to_parquet("data.parquet", index=False) # 读取Parquet格式,字节列会自动保留原生类型 df = pd.read_parquet("data.parquet")
该方案性能、存储空间占用都优于CSV,优先推荐场景允许时使用
内容的提问来源于stack exchange,提问作者Quasi
相关产品推荐
相关产品推荐

