写有“bytearray(…)”的csv数据文件

2024-10-03 11:16:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两列的csv文件,例如:

1621324695.083352,bytearray(b'\x00\x00\x14G\x00\x00\n\xfe')

第一个值是时间戳,另一个值是数据

我的问题是,当我试图读取带有pd.read_csv()的文件时,bytearray值会变成字符串。有没有办法告诉python它已经是一个bytearray

当我使用函数bytearray()时,它输出:bytearray(bytearray(b'...'))


Tags: 文件csv数据函数字符串read时间pd
1条回答
网友
1楼 · 发布于 2024-10-03 11:16:04

该文件中没有bytearray,只有其文本表示(纯文本)。我们需要从中重建bytearray

要将像"bytearray(b'\x00\x00\x14G\x00\x00\n\xfe')"这样的字符串转换为实字节数组,第一个想法通常是使用eval,但有充分的理由尽可能避免使用eval

我们可以简单地从字符串中提取参数,处理其中的转义序列(如\x00\n),并将结果传递给bytearray(),以便创建最终的对象

要提取参数,请使用正则表达式等。如果格式是固定的,简单的工具就可以了

转义序列可以使用'unicode-escape'解码器取消转义,但我们必须将字符串转换为字节latin1只是8位ASCII的名称,即bytearray使用的0-255个值

一个简单的演示:

inp = r"bytearray(b'\x00\x00\x14G\x00\x00\n\xfe')"
if inp.startswith("bytearray(b'") and inp.endswith("')"):
    arg = inp[12:-2]   # strip bytearray(b' and '), leave the string in between
    unesc = arg.encode('latin1').decode('unicode-escape')
    ba = bytearray(unesc, 'latin1')
    print(f"result: {ba!r}")
else:
    print("parse error!")

ba是一个实字节数组,它的表示repr(ba)等于inp

相关问题 更多 >