我对Python还很陌生,有时看起来很简单的事情变得比预期复杂得多
我当前正在使用字节缓冲区从套接字读取:
data = self.socket.recv(size)
然后处理该缓冲区的一部分并需要将其删除
问题是我一直在寻找一种方法来做到这一点,但整个晚上都没有找到线索,我很确定由于所涉及的文字,我没有得到任何公平的结果,或者也许不是可能
我尝试使用“del”,但收到错误消息,表示不支持它
我的做法是错误的吗?也许有人可以引导我走正确的路? :)
bytes
不支持项目删除,因为它是不可变的。要“修改”字符串和类似字符串的对象,您需要获取副本,因此要删除 olddata[start:end]
,请执行以下操作:
newdata = olddata[:start] + olddata[end:]
当然,这是相当大量的复制,并非所有这些都是必要的,因此您可能更愿意稍微修改代码以提高性能。您可以使用
bytearray
(这是可变的)。或者,也许您可以找到一种方法来处理缓冲区(使用索引或迭代其元素),而不是需要在每个步骤后缩短它。
我想我找到了正确的方法,只是从另一个角度来看:
self.data = self.data[Index:]
只是再次将我需要的内容复制到自身
Python 的
struct.unpack
通常是切片的可行替代方案,有时甚至更可取。虽然在这种情况下还不清楚,但 FWIW 以下是如何将其应用于您的问题:
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'