从循环中的字节数组中读取任意数量的字节

2024-06-28 19:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我将数据作为字节块包含在ByteArray中。这样做一次只能读取一个字节:

for byteValue in byteString:
    doSomething(byteValue)

如何创建一个类似的结构,一次读取n字节,并在引发StopIteration时停止?(如果可能,还带有for循环


Tags: 数据infor字节结构stopiterationbytestringbytearray
2条回答

我认为除了加载整个阵列然后对其进行切片之外,没有其他好方法。如果您的内存中已经有bytearray,那么这不是问题,但是如果您从文件中读取bytearray,则内存效率较低

blockSize = 4
byteString = bytearray("abcdefghijkl", encoding="utf-8")

for i in range(len(byteString), blockSize):
    print(byteString[i:i+blockSize])

或者,可以将字节累积到单独的字节数组中

n = 0
while n < len(byteString):
    bbytes = [byteString.pop(0) for i in range(blockSize)]
    n += len(bytes)

或者,如果byteString是迭代器,例如来自open('...', 'rb')

with open('myfile.bin', 'rb') as bf:
    while True:
        bbytes = bf.read(blockSize)
        if not bbytes:
            break

有很多方法可以做你想做的事。这里有一个相对简单的方法,它将字节字符串视为字节,然后使用内置的^{}函数和^{}组合,一次以n(或更少)字节块处理它

重要的是要注意iter()函数支持的可选的sentinel参数b''值是如何用于在遇到流的结尾时引发StopIteration

from functools import partial
from io import BytesIO


byteString = b'Cras mollis mauris vitae libero ornare finibus Donec nibh odio'
n = 4

byte_stream = BytesIO(byteString)
for block in iter(partial(byte_stream.read, n), b''):
    print(block)

输出:

b'Cras'
b' mol'
b'lis '
b'maur'
b'is v'
b'itae'
b' lib'
b'ero '
b'orna'
b're f'
b'inib'
b'us D'
b'onec'
b' nib'
b'h od'
b'io'

相关问题 更多 >