python:zip文件迭代器一起提取下一行

时间:2017-04-05 11:21:29

标签: python list io iterator

拥有多行数据文件,例如比如getResponse()

res.send(test.getResponse())

f1

name1
34
name2
12
name3
331

为了解析单个文件,我使用的成语如下:

f2

如何使用相同的模式阅读"配对" name1 0.34 name2 0.1 name3 1.0 with open(f1, "r") as f1: while True: name, data = next(f1), next(f1) # Do something with name and data... 等文件?

f1

似乎代码是贪婪的,f2def multi_parser(f1, f2): with open(f1, "r") as f1_in, open(f2, "r") as f2_in: while True: name, data = list(zip(next(f1_in).rstrip(), next(f2_in).rstrip())), list(zip(next(f1_in).rstrip(), next(f2_in).rstrip())) # Do something with name and data... print(list(name)) print(list(data)) 的第一个印刷品给出了:

name

我期望的地方如下:

data

4 个答案:

答案 0 :(得分:6)

问题是next返回字符串并迭代它们(它给你单个字符对)。您可以只为listtuple使用文字:

name, data = [(next(f1_in), next(f2_in))], [(next(f1_in), next(f2_in))]

或者,如果您想避免所有这些next来电:

f1_in, f2_in = iter(f1_in), iter(f2_in)  # make sure f1_in and f2_in are iterators

for name1, name2, value1, value2 in zip(f1_in, f2_in, f1_in, f2_in):
    name = [(name1, name2)]
    data = [(value1, value2)]

答案 1 :(得分:2)

我建议拆分代码,首先创建一个生成器函数,一次生成两个元素:

def pairs(file):
    try:
        while True: #broken by StopIteration
            yield next(file), next(file)
    except StopIteration:
        return

这种迭代单个文件的方法可以使用for循环:

for name, data in pairs(f1):
    print(name, data)

然后同时迭代两个文件,您可以使用zip轻松完成:

for (name1, data1),(name2,data2) in zip(pairs(f1),pairs(f2)):
    print(name1, data1)
    print(name2,data2)

我觉得我对pairs的定义与:

相同
return zip(file, file)

所以你在技术上可以做你想要的迭代:

for (name1, data1), (name2, data2) in zip(zip(f1,f1),zip(f2,f2)):
    print(name1, data1)
    print(name2, data2)

但我不建议不定义pairs函数(即使它只是一次返​​回)并且很好地评论它。

答案 2 :(得分:0)

出现问题,因为您将两个字符串传递给zip,即文件的各行。 zip然后在这些字符串的字符对上返回一个迭代器:

list(zip("asdf", "ghjk"))

给出

[('a', 'g'), ('s', 'h'), ('d', 'j'), ('f', 'k')]

如果您想要整行的元组,您可以这样做:

name, data = ([(next(f1_in).rstrip(), next(f2_in).rstrip())], 
              [(next(f1_in).rstrip(), next(f2_in).rstrip())])

答案 3 :(得分:0)

def my_iter(f1, f2):
    while True:
        yield [next(f1).strip(), next(f2).strip()], [next(f1).strip(), next(f2).strip()]


with open('f1', 'r') as f1, open('f2', 'r') as f2:
    for name, data in my_iter(f1, f2):
        print(name)
        print(data)

您可以获得如下结果:

['name1', 'name1']
['34', '0.34']
['name2', 'name2']
['12', '0.1']
['name3', 'name3']
['331', '1.0']