我是python的新手,有时看起来非常简单的事情变得比预期的复杂很多
我目前正在使用字节缓冲区从套接字读取:
data = self.socket.recv(size)
然后处理该缓冲区的一部分并需要将其删除
问题是我一直在寻找一种方法,并且在整个晚上都没有找到线索,我很确定我没有得到任何公平的结果,因为所涉及的话,或许这是不可能的
我尝试使用“del”,但收到错误消息说不支持
我做错了吗?也许有人能以正确的方式引导我? :)
答案 0 :(得分:5)
bytes
不支持删除项目,因为它是不可变的。要“修改”字符串和类似字符串的对象,您需要复制一份,以便删除olddata[start:end]
执行:
newdata = olddata[:start] + olddata[end:]
当然这是相当多的复制,并非所有这些都是必要的,所以您可能更愿意为了性能而重新编写代码。你可以使用bytearray
(这是可变的)。或许你可以找到一种方法来处理缓冲区(使用索引或迭代其元素),而不是在每一步之后缩短它。
答案 1 :(得分:1)
我认为我找到了正确的方法,只是从另一个角度来看:
self.data = self.data [索引:]
再次复制我需要的东西
答案 2 :(得分:1)
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'