拥有多行数据文件,例如比如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
似乎代码是贪婪的,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
答案 0 :(得分:6)
问题是next
返回字符串并迭代它们(它给你单个字符对)。您可以只为list
和tuple
使用文字:
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']