我对Python编程很新,有时候看起来很简单的事情变得比预期复杂。
目前我正在使用字节缓冲区从套接字读取:
data = self.socket.recv(size)
然后处理部分缓冲区并需要将其删除
问题是我一直在寻找一种方法来做到这一点,整个晚上都没有找到任何线索,我很确定由于涉及的词语或者可能不可能实现,所以我没有得到公正的结果
我试过用“del”但出现了一个错误,说不支持
我做错了吗?也许有人可以带我走向正确的方向? :)
我对Python编程很新,有时候看起来很简单的事情变得比预期复杂。
目前我正在使用字节缓冲区从套接字读取:
data = self.socket.recv(size)
然后处理部分缓冲区并需要将其删除
问题是我一直在寻找一种方法来做到这一点,整个晚上都没有找到任何线索,我很确定由于涉及的词语或者可能不可能实现,所以我没有得到公正的结果
我试过用“del”但出现了一个错误,说不支持
我做错了吗?也许有人可以带我走向正确的方向? :)
bytes
不支持项目删除,因为它是不可变的。要“修改”字符串和类似字符串的对象,你需要先复制,所以要移除 olddata[start:end]
,可以这样做:
newdata = olddata[:start] + olddata[end:]
当然,这是相当多的复制,其中并非所有都是必要的,因此您可能更喜欢重新设计代码以提高性能。您可以使用bytearray
(它是可变的)。或者,您可以找到一种方法来通过缓冲区工作(使用索引或迭代其元素),而不需要在每个步骤后缩短它。
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'