在不同大小的python块中遍历字符串

时间:2018-07-05 14:30:47

标签: python string list split chunks

所以我正在使用python处理文件,感觉它们有一个名字,但是我不确定它是什么。它们就像csv文件,但没有分隔符。无论如何,在我的文件中,我都有很多行数据,其中前7个字符是ID号,然后下5个字符是其他数字,依此类推。所以我想遍历文件,读取每一行并将其拆分并存储到列表中。这是一个示例:

从文件中:"0030108102017033119080001010048000000"

这些是我想将字符串拆分成的块:[7, 2, 8, 6, 2, 2, 5, 5]每个数字代表每个块的长度。

首先,我尝试了这一点:

n = [7, 2, 8, 6, 2, 2, 5, 5]
for i in range(0, 37, n):
    print(i)

自然这是行不通的,所以现在我开始考虑可能的方法,它们似乎都非常复杂。我在网上四处张望,似乎什么也找不到,甚至找不到大小的块。有什么输入吗?

编辑:在这种情况下,我正在寻找的答案应如下所示:     ['0030108', '10', '20170331', '190800', '01', '01', '00480', '00000'] 其中列表n中的每个值代表每个块的长度。

4 个答案:

答案 0 :(得分:3)

如果这些是ASCII字符串(或者每个字符一个字节),我可以为此使用struct.unpack

>>> import struct
>>> sizes = [7, 2, 8, 6, 2, 2, 5, 5]
>>> struct.unpack(''.join("%ds" % x for x in sizes), "0030108102017033119080001010048000000")
('0030108', '10', '20170331', '190800', '01', '01', '00480', '00000')
>>>

否则,您可以从部分大小的和中构造必要的slice对象,如果您使用的是Python 3,这很容易做到:

>>> psums = list(itertools.accumulate([0] + sizes))
>>> [s[slice(*i)] for i in zip(psums, psums[1:])]
['0030108', '10', '20170331', '190800', '01', '01', '00480', '00000']

accumulate可以在Python 2中以类似的方式实现

def accumulate(itr):
    total = 0
    for x in itr:
        total += x
        yield total

答案 1 :(得分:2)

{{1}}

答案 2 :(得分:1)

您可以尝试吗?

for line in file:
    n = [7, 2, 8, 6, 2, 2, 5, 5]
    total = 0
    for i in n:
        print(line[total:total+i])
        total += i 

这就是我可能要做的。代码遍历文件的每一行,对于每一行,遍历您需要拉出的长度列表n。可以将其修改为执行其他操作而不是打印,但是这样做的目的是从该行返回一个切片。 total变量跟踪我们到行的距离。

答案 3 :(得分:0)

这里是一个生成器,它通过迭代lsit的字符并从中形成子串来产生块。您可以使用此方法以这种方式处理任何可迭代的对象。:

def chunks(s, sizes):
    it = iter(s)
    for size in sizes:
        l = []
        try:
            for _ in range(size):
                l.append(next(it))
        finally:
            yield ''.join(l)

s="0030108102017033119080001010048000000"
n = [7, 2, 8, 6, 2, 2, 5, 5]
print(list(chunks(s, n)))
# ['0030108', '10', '20170331', '190800', '01', '01', '00480', '00000']