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)
我如何可以使用相同的模式来念想"配对"文件f1和f2?
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)
似乎代码是贪婪的,第一次打印name并data给出:
[('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)
问题是next返回字符串并迭代它们(它给你单个字符对).你可以只使用文字的list和tuple:
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)