如何持续忽略字符串中的一个字节
我在处理一个程序,这个程序总是返回很多 byte
对象。
经常会在字符串中间返回一个空的 b'00'
。我想完全忽略这个(比如说如果我要把这些字节放进一个数组里)。难道我每次循环或者代码的每个部分都必须加一个:
if bytes != b'\x00':
# Do something
才能处理这个问题,还是说有更好的方法可以跳过这些字节呢?
附加问题:在Python 3中,像这样的长“字节串”应该称作“字节对象”、“字节串”还是“字节数组”?
什么是正确的术语?
3 个回答
0
如果你在Python中有一个列表,你可以这样做:
list = [x for x in originallist if x is not None]
1
你可以使用 in
来进行成员测试:
>>> b'\x00' in bytes([1, 2, 3])
False
>>> b'\x00' in bytes([0, 1, 2, 3])
True
这里的 b'\x00'
生成了一个包含单个空字节的 bytes
对象(而 b'00'
则生成了一个长度为2的对象,里面有两个字节,值都是48)。
我把这些东西称为 bytes
对象,有时也叫字节字符串,但后者通常只在Python 2的上下文中使用。bytearray
是一种不同的类型(它是 bytes
类型的可变版本)。
3
通常,你会使用一个经过筛选的对象版本,比如:
In [63]: test
Out[63]: 'hello\x00world'
In [68]: for my_bytes in filter(lambda x: x != b'\x00', test):
....: print(my_bytes)
....:
h
e
l
l
o
w
o
r
l
d
注意,我用了 my_bytes
而不是 bytes
,因为 bytes
是一个内置的名字,最好不要覆盖它。
类似地,你也可以简单地构建一个经过筛选的字节对象,以便进行进一步处理:
In [62]: test = b'hello\x00world'
In [63]: test
Out[63]: 'hello\x00world'
In [64]: test_without_nulls = bytes(filter(lambda x: x != b'\x00', test))
In [65]: test_without_nulls
Out[65]: 'helloworld'
我通常使用 bytes
对象,因为它在 Python 3 中与字符串没有共享的接口。当然,也不是字节 数组。