【发布时间】:2017-04-05 11:21:28
【问题描述】:
拥有多行数据文件,例如喜欢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 和 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))
似乎代码很贪心,name 和 data 的第一个打印给出:
[('n', 'n'), ('a', 'a'), ('m', 'm'), ('e', 'e'), ('1', '1')]
[('3', '0'), ('4', '.')]
我期望的地方是:
[('name1', 'name1')]
[('34', '0.34')]
【问题讨论】:
-
除此之外的裸体是怎么回事?
-
可能是别的东西 - 它只是没有给出任何警告或任何东西。不过,我不应该与我的意外结果有任何关系
-
zip接受迭代并返回项目列。在这种情况下,您正在传递字符串,这就是您获得字符的原因。您只需将文件对象传递给zip。zip(f1_in, f2_in)或者如果你想去除线条:zip(map(str.rstrip, f1_in), map(str.rstrip, f2_in)) -
我需要为每条记录做一些事情(即每两行)
-
@TadhgMcDonald-Jensen 你可以使用
zip,然后在每次迭代后使用next,或者使用另一个zip和itertools.islice。zip(islice(pre_ziped, 0, None, 2),islice(pre_ziped, 1, None, 2))