如何持续忽略字符串中的一个字节

1 投票
3 回答
1366 浏览
提问于 2025-04-18 18:25

我在处理一个程序,这个程序总是返回很多 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 中与字符串没有共享的接口。当然,也不是字节 数组

撰写回答