Python 包格式字符串中的自动重复标志

Python 包格式字符串中的自动重复标志,python,pack,Python,Pack,在php中,unpack()具有“*”标志,表示“重复此格式直到输入结束”。例如,这打印97、98、99 $str = "abc"; $b = unpack("c*", $str); print_r($b); python中有类似的东西吗?当然可以 str = "abc" print struct.unpack("b" * len(str), str) 但是我想知道是否有更好的方法。在struct.unpack中没有内置这样的功能,但是可以定义这样的功能: import struct de

在php中,unpack()具有“*”标志,表示“重复此格式直到输入结束”。例如,这打印97、98、99

$str = "abc";
$b = unpack("c*", $str);
print_r($b);
python中有类似的东西吗?当然可以

str = "abc"
print struct.unpack("b" * len(str), str)

但是我想知道是否有更好的方法。

struct.unpack
中没有内置这样的功能,但是可以定义这样的功能:

import struct

def unpack(fmt, astr):
    """
    Return struct.unpack(fmt, astr) with the optional single * in fmt replaced with
    the appropriate number, given the length of astr.
    """
    # http://stackoverflow.com/a/7867892/190597
    try:
        return struct.unpack(fmt, astr)
    except struct.error:
        flen = struct.calcsize(fmt.replace('*', ''))
        alen = len(astr)
        idx = fmt.find('*')
        before_char = fmt[idx-1]
        n = (alen-flen)/struct.calcsize(before_char)+1
        fmt = ''.join((fmt[:idx-1], str(n), before_char, fmt[idx+1:]))
        return struct.unpack(fmt, astr)

print(unpack('b*','abc'))
# (97, 98, 99)

在Python3.4及更高版本中,可以使用新函数

结构iter解包(fmt,缓冲区)

根据格式字符串fmt从缓冲区迭代解包。此函数返回一个迭代器,该迭代器将从缓冲区中读取大小相等的块,直到其所有内容都被使用为止。缓冲区的字节大小必须是格式所需大小的倍数,如calcsize()所示。

每次迭代产生一个由格式字符串指定的元组


我们假设要拆开数组<代码> b′\x01\x02\x03′* 3 < /COD>重复格式字符串<代码> 'jBelndo],您应该考虑把这个移动到答案。

>>> import struct
>>> some_bytes = b'\x01\x02\x03'*3
>>> fmt = '<2sc'
>>> 
>>> tuple(struct.iter_unpack(fmt, some_bytes))
((b'\x01\x02', b'\x03'), (b'\x01\x02', b'\x03'), (b'\x01\x02', b'\x03'))
>>> from itertools import chain
>>> tuple(chain.from_iterable(struct.iter_unpack(fmt, some_bytes)))
(b'\x01\x02', b'\x03', b'\x01\x02', b'\x03', b'\x01\x02', b'\x03')
>>> tuple(x for subtuple in struct.iter_unpack(fmt, some_bytes) for x in subtuple)
(b'\x01\x02', b'\x03', b'\x01\x02', b'\x03', b'\x01\x02', b'\x03')