如何从Python中的字节对象中删除一定范围的字节?

问题描述 投票:0回答:3

我对Python还很陌生,有时看起来很简单的事情变得比预期复杂得多

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

data = self.socket.recv(size)

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

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

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

我的做法是错误的吗?也许有人可以引导我走正确的路? :)

python python-3.x
3个回答
10
投票

bytes
不支持项目删除,因为它是不可变的。要“修改”字符串和类似字符串的对象,您需要获取副本,因此要删除
olddata[start:end]
,请执行以下操作:

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

当然,这是相当大量的复制,并非所有这些都是必要的,因此您可能更愿意稍微修改代码以提高性能。您可以使用

bytearray
(这是可变的)。或者,也许您可以找到一种方法来处理缓冲区(使用索引或迭代其元素),而不是需要在每个步骤后缩短它。


5
投票

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

self.data = self.data[Index:]

只是再次将我需要的内容复制到自身


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'
© www.soinside.com 2019 - 2024. All rights reserved.