【问题标题】:Converting a list of bytes data to string将字节数据列表转换为字符串
【发布时间】:2021-04-12 06:29:46
【问题描述】:

请建议一种将字节列表转换为字符串列表的方法或任何方法,以便我可以将 resp 数据作为字符串读取,我尝试使用 decode 但不支持以下错误 -

类“list”的未解析属性引用“decode”

resp = [b'\r\x1b[2K\x1b[39m[00479650ms][INFO][MBED_DC]: dc_func:230 Waiting \r\n',
    b'\x1b[0m\r\n', b'AT+BOOTARG=TRACE=ON\r\r\n']

【问题讨论】:

  • 你的预期输出是什么?
  • decode 不是列表的方法,而是列表中每个字节对象的方法。遍历列表,随时解码每个元素。有几种方法可以做到这一点,即map 和列表推导式。
  • resp_dec = list(map(lambda x: x.decode("utf-8"), resp))
  • 感谢它转换但在第一个项目后停止你能告诉我如何修复它 resp = [b'\r\x1b[2K\x1b[39m[00479650ms][INFO][MBED_DC]: dc_func:230 等待 \r\n', b'\x1b[0m\r\n', b'AT+BOOTARG=TRACE=ON\r\r\n'] resp_decoded = list(map(lambda i: i. decode('utf8'), resp)) print(resp_decoded) final_str = "".join(resp_decoded) print(final_str) ==> [00479650ms][INFO][MBED_DC]: dc_func:230 等待,这里是 AT+BOOTARG= TRACE=ON 被跳过
  • 检查您的输入/输出。它不应该停止,在您的代码示例中,您编写的输入和输出之间没有关联。所以我有理由相信你的意见与你在问题中写的不完全一样。

标签: python python-3.x list python-2.7


【解决方案1】:

解码:

resp = [b'\r\x1b[2K\x1b[39m[00479650ms][INFO][MBED_DC]: dc_func:230 Waiting \r\n',
    b'\x1b[0m\r\n', b'AT+BOOTARG=TRACE=ON\r\r\n']
decode_list = []
for item in resp:
    decode_list.append(item.decode("utf-8"))

时间比较:

exp1 = """
resp = [b'item1',b'item2']
new_list = []
for item in resp:
    new_list.append(item.decode("utf-8"))
"""

exp2 = """
resp = [b'item1',b'item2']
new_list = [item.decode("utf-8") for item in resp]
"""

exp3 = """
resp = [b'item1',b'item2']
resp_dec = list(map(lambda x: x.decode("utf-8"), resp))
"""

timeit(exp1, number=1000)
timeit(exp2, number=1000)
timeit(exp3, number=1000)

exp3 看起来更“优雅”,虽然速度较慢。

输出:

   exp1 --> 0.0002586000000000116
   exp2 --> 0.00029969999999999997
   exp3 --> 0.0004574999999999996

【讨论】:

  • 已经尝试过了——它失败了,列表'对象没有属性'解码'
  • @Lp-Tester 这是列表中的每个项目,而不是列表本身。如上所述 decode 不是列表的方法。
  • 感谢大卫,它适用于单个项目,我可以一次获取所有字符串,目前它在 [00479650ms][INFO][MBED_DC]: dc_func:230 Waiting only ,下一个在+bootarg 没有被转换
  • 我只是喜欢在一个微小的样本集上运行一次微基准测试,并声称某样东西“更快”。
  • @shevron 这个主要是跟社区分享一下利弊。你是对的,也许它对于一些小样本来说是微不足道的,但对于更大的输入等......其他人可能会考虑它。
【解决方案2】:

使用 map 对列表中的每一项进行解码,并将其全部映射到一个新列表中:

resp_decoded = list(map(lambda i: i.decode('utf8'), resp))

【讨论】:

  • 这不是一个列表,而是一个地图对象
  • @mcsoini 正确,当然你上面的建议解决了这个问题:)
  • 感谢它转换但在第一个项目后停止你能告诉我如何修复它 resp = [b'\r\x1b[2K\x1b[39m[00479650ms][INFO][MBED_DC]: dc_func:230 等待 \r\n', b'\x1b[0m\r\n', b'AT+BOOTARG=TRACE=ON\r\r\n'] resp_decoded = list(map(lambda i: i. decode('utf8'), resp)) print(resp_decoded) final_str = "".join(resp_decoded) print(final_str) ==> [00479650ms][INFO][MBED_DC]: dc_func:230 等待,这里是 AT+BOOTARG= TRACE=ON 被跳过
猜你喜欢
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2016-05-05
  • 2021-11-11
相关资源
最近更新 更多