7

我对python很陌生,有时看起来很容易的事情变得比预期的要复杂得多

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

数据 = self.socket.recv(大小)

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

问题是我一直在寻找一种方法来做到这一点并且整个晚上都没有找到线索,我很确定由于涉及的文字,我没有得到任何公平的结果,或者也许这是不可能的

我尝试使用“del”,但收到错误消息说它不受支持

我做错了吗?也许有人可以引导我正确的方式?:)

4

3 回答 3

9

bytes不支持删除项目,因为它是不可变的。要“修改”字符串和类似字符串的对象,您需要复制一份,因此要删除olddata[start:end]

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

当然,这是相当多的复制,并非所有复制都是必需的,因此您可能更愿意重新编写代码以提高性能。你可以使用bytearray(这是可变的)。或者也许您可以找到一种方法来处理缓冲区(使用索引或迭代其元素),而不是在每一步之后都需要缩短它。

于 2013-09-01T21:20:30.310 回答
3

我想我找到了正确的方法,只是从另一个角度来看:

self.data = self.data[索引:]

只是将我需要的东西再次复制到自己身上

于 2013-09-01T21:19:05.913 回答
1

Pythonstruct.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'
于 2013-09-02T01:05:57.340 回答