【问题标题】:Efficient way to split a bytes array then convert it to string in Python拆分字节数组然后在Python中将其转换为字符串的有效方法
【发布时间】:2023-04-04 11:32:01
【问题描述】:

我有一个包含字符的 numpy 字节数组,后跟 b'',然后是其他字符(包括在解码时引发 Unicode 错误的奇怪字符):

bytes = numpy.array([b'f', b'o', b'o', b'', b'b', b'a', b'd', b'\xfe', b'\x95', b'', b'\x80', b'\x04', b'\x08' b'\x06'])

我想在第一个 b'' 之前得到所有东西。

目前我的代码是:

txt = []
for c in bytes:
    if c != b'':
        txt.append(c.decode('utf-8'))
    else:
        break
txt = ''.join(txt)

我想有一种更有效和 Pythonic 的方式来做到这一点。

【问题讨论】:

标签: python python-3.x numpy split


【解决方案1】:

我喜欢你的方式,它很明确,for 循环是所有人都可以理解的,与其他方法相比它并没有那么慢。

我提出的一些建议是将您的条件从if c != b'' 更改为if c,因为非空字节对象将是真实的,*不要将您的列表命名为bytes,您会屏蔽内置的-在!将其命名为 bt 或类似名称 :-)

其他选项包括itertools.takewhile,只要谓词成立,它就会从可迭代对象中获取元素;您的操作如下所示:

"".join(s.decode('utf-8') for s in takewhile(bool, bt))

这会稍微慢一些,但更紧凑,如果您是单线爱好者,这可能会吸引您。

使用index 和切片会稍微快一点,也更紧凑:

"".join(b.decode('utf-8') for b in bt[:bt.index(b'')])

虽然紧凑,但它也受到可读性的影响。

简而言之,我会使用 for 循环,因为在我看来,可读性非常Python。

【讨论】:

  • 感谢您的建议!哦,实际上字节数组是一个 numpy 数组。我喜欢您的第二个解决方案,但我对这 3 个解决方案进行了基准测试(使用 ba[:np.where(ba == b'')[0][0]] 而不是 ba[:ba.index(b'')]) 并且看起来 for 循环解决方案更快,所以我选择了它。
  • @user2914540 哦,我不知道它是一个 numpy 数组,也许添加 numpy 标签并指定 bytes 是一个 numpy 数组?在 numpy 中可能有更有效的方法来做到这一点。
  • 完成。抱歉,这个数组来自外部库(netcdf4py),我通过尝试执行 ab.index() 发现它是一个 numpy 数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多