Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以不同大小的块遍历字符串_Python_String_List_Split_Chunks - Fatal编程技术网

Python 以不同大小的块遍历字符串

Python 以不同大小的块遍历字符串,python,string,list,split,chunks,Python,String,List,Split,Chunks,所以我用python处理文件,感觉它们有名字,但我不确定它是什么。它们类似于csv文件,但没有分隔符。无论如何,在我的文件中,我有很多行数据,其中前7个字符是一个ID号,然后下5个是其他的,依此类推。所以我想浏览文件,读取每一行并将其拆分,然后将其存储到一个列表中。以下是一个例子: 从文件:“003010810201703311980001010048000000” 这些是我想将字符串分割成的块:[7,2,8,6,2,2,5,5]每个数字代表每个块的长度 首先,我尝试了这个: n = [7, 2

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

从文件:
“003010810201703311980001010048000000”

这些是我想将字符串分割成的块:
[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的字符并从中形成子字符串来生成块。您可以用它以这种方式处理任何iterable:

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']

下面是一个生成器,它通过迭代lsit的字符并从中形成子字符串来生成块。您可以用它以这种方式处理任何iterable:

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
变量跟踪我们到了哪一行

你能试试这个吗

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
可以在Python2中通过以下方式实现

def accumulate(itr):
    total = 0
    for x in itr:
        total += x
        yield 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
可以在Python2中通过以下方式实现

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