Skip to main content
 首页 » 编程设计

python之遍历不同大小的python block 中的字符串

2025年05月04日30leader

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

来自文件:"0030108102017033119080001010048000000"

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

首先我尝试了这个:

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

当然这行不通,所以现在我开始考虑可能的方法,但它们看起来都很复杂。我在网上环顾四周,似乎找不到任何东西,只有大小均匀的 block 。那么有什么意见吗?

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

请您参考如下方法:

如果这些是 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