簡體   English   中英

在不同大小的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中的每個值代表每個塊的長度。

如果這些是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']

你可以試試這個嗎?

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 (位於列表n 可以將其修改為執行其他操作而不是打印,但是這樣做的目的是從該行返回一個切片。 total變量跟蹤我們到行中的距離。

這是一個生成器,它通過遍歷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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM