我有一个包含字符的numpy bytes数组,后跟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的方式来做到这一点。
答案 0 :(得分:4)
我喜欢你的方式,这是明确的,所有人都可以理解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循环,因为在我看来,可读性非常像pythonic。