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

use*_*672 2 python io iterator list

拥有多行数据文件,例如f1:

name1
34
name2
12
name3
331
Run Code Online (Sandbox Code Playgroud)

并且f2:

name1
0.34
name2
0.1
name3
1.0
Run Code Online (Sandbox Code Playgroud)

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

with open(f1, "r") as f1: 
    while True:      
        name, data = next(f1), next(f1)
        # Do something with name and data...
Run Code Online (Sandbox Code Playgroud)

我如何可以使用相同的模式来念想"配对"文件f1f2

def 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))
Run Code Online (Sandbox Code Playgroud)

似乎代码是贪婪的,第一次打印namedata给出:

[('n', 'n'), ('a', 'a'), ('m', 'm'), ('e', 'e'), ('1', '1')]
[('3', '0'), ('4', '.')]
Run Code Online (Sandbox Code Playgroud)

在哪里我期望的东西:

[('name1', 'name1')]
[('34', '0.34')]
Run Code Online (Sandbox Code Playgroud)

MSe*_*ert 6

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

name, data = [(next(f1_in), next(f2_in))], [(next(f1_in), next(f2_in))]
Run Code Online (Sandbox Code Playgroud)

或者如果你想避免所有这些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)]
Run Code Online (Sandbox Code Playgroud)