以不同大小的块 python 遍历字符串
Iterate through a string in chunks of different sizes python
所以我正在处理 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 中的每个值代表每个块的长度。
这是一个生成器,它通过遍历 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']
你能试试这个吗?
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
变量跟踪我们进入线的距离。
如果这些是 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
from itertools import accumulate, chain
s = "0030108102017033119080001010048000000"
n = [7, 2, 8, 6, 2, 2, 5, 5]
ranges = list(accumulate(n))
list(map(lambda i: s[i[0]:i[1]], zip(chain([0], ranges), ranges))
# ['0030108', '10', '20170331', '190800', '01', '01', '00480', '00000']
所以我正在处理 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 中的每个值代表每个块的长度。
这是一个生成器,它通过遍历 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']
你能试试这个吗?
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
变量跟踪我们进入线的距离。
如果这些是 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
from itertools import accumulate, chain
s = "0030108102017033119080001010048000000"
n = [7, 2, 8, 6, 2, 2, 5, 5]
ranges = list(accumulate(n))
list(map(lambda i: s[i[0]:i[1]], zip(chain([0], ranges), ranges))
# ['0030108', '10', '20170331', '190800', '01', '01', '00480', '00000']