如何在Python中从字节对象中删除一系列字节?

9

我对Python编程很新,有时候看起来很简单的事情变得比预期复杂。

目前我正在使用字节缓冲区从套接字读取:

data = self.socket.recv(size)

然后处理部分缓冲区并需要将其删除

问题是我一直在寻找一种方法来做到这一点,整个晚上都没有找到任何线索,我很确定由于涉及的词语或者可能不可能实现,所以我没有得到公正的结果

我试过用“del”但出现了一个错误,说不支持

我做错了吗?也许有人可以带我走向正确的方向? :)

3个回答

10

bytes 不支持项目删除,因为它是不可变的。要“修改”字符串和类似字符串的对象,你需要先复制,所以要移除 olddata[start:end],可以这样做:

newdata = olddata[:start] + olddata[end:]

当然,这是相当多的复制,其中并非所有都是必要的,因此您可能更喜欢重新设计代码以提高性能。您可以使用bytearray(它是可变的)。或者,您可以找到一种方法来通过缓冲区工作(使用索引或迭代其元素),而不需要在每个步骤后缩短它。


4
我认为我找到了正确的方法,只是从另一个角度看:
self.data = self.data[Index:]
将我需要的内容复制到自身。

1

Python的struct.unpack经常是切片的可行替代方案,有时更可取。虽然在这种情况下不太清楚,但以下是如何将其应用于您的问题:

import struct

def remove_bytes(buffer, start, end):
    fmt = '%ds %dx %ds' % (start, end-start, len(buffer)-end)  # 3 way split
    return b''.join(struct.unpack(fmt, buffer))

data = b'abcdefghijk'
print( remove_bytes(data, 2, 4) )  # b'abefghijk'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接