如何从python中的字节对象中删除一系列字节?

时间:2013-09-01 21:14:08

标签: python python-3.x

我是python的新手,有时看起来非常简单的事情变得比预期的复杂很多

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

data = self.socket.recv(size)

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

问题是我一直在寻找一种方法,并且在整个晚上都没有找到线索,我很确定我没有得到任何公平的结果,因为所涉及的话,或许这是不可能的

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

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

3 个答案:

答案 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'