我有2个文本文件,我想同时迭代它们。
即:
File1中:
x1 y1 z1
A,53,45,23
B,65,45,32
文件2:
x2 y2 z2
A,0.6,0.9,0.4
B,8.6,1.0,2.3
我希望同时使用两个文件中的值:
e.g:
c1 = x1*x2 + y1*y2 + z1*z2 #for first line
c2 = x1*x2 + y1*y2 + z1*z2 #for second line
如何使用Python做到这一点?
答案 0 :(得分:6)
您需要将这两个文件视为迭代器并将其压缩。 Izip将允许您以懒惰的方式阅读文件:
from itertools import izip
fa=open('file1')
fb=open('file2')
for x,y in izip(fa, fb):
print x,y
现在你已经有了一对线,你应该能够根据需要解析它们并打印出正确的公式。
答案 1 :(得分:1)
Python的内置zip()
函数非常适用于此:
>>> get_values = lambda line: map(float, line.strip().split(',')[1:])
>>> for line_from_1,line_from_2 in zip(open('file1'), open('file2')):
... print zip(get_values(line_from_1), get_values(line_from_2))
... print '--'
...
[]
--
[(53.0, 0.6), (45.0, 0.9), (23.0, 0.4)]
--
[(65.0, 8.6), (45.0, 1.0), (32.0, 2.3)]
--
>>>
由此,您应该可以根据需要使用这些值。像这样:
print sum([x * y for x,y in zip(get_values(line_from_1), get_values(line_from_2))])
我得到了这个结果:
81.5
677.6
答案 2 :(得分:0)
这对我有用:
with open("file1.txt") as f1, open("file2.txt") as f2:
# Ignore header line and last newline
files = f1.read().split("\n")[1:-1]
files += f2.read().split("\n")[1:-1]
# Split values and remove row name from lists
# string -> float all values read
a1, a2, b1, b2 = (map(float, elem.split(",")[1:]) for elem in files)
# Group by row
a = zip(*[a1, b1])
b = zip(*[a2, b2])
c1 = sum(e1 * e2 for e1, e2 in a)
c2 = sum(e1 * e2 for e1, e2 in b)
然后结果......
>>> print c1
81.5
>>> print c2
677.6
编辑:如果您的Python版本不支持巫术,您可以这样做:
# Open files, dont forget to close them!
f1 = open("file1.txt")
f2 = open("file2.txt")
# Ignore header line and last newline
files = f1.read().split("\n")[1:-1]
files += f2.read().split("\n")[1:-1]
f1.close()
f2.close()
答案 3 :(得分:0)
如果所有数据都作为示例同步,则使用(i)zip
给出的所有示例都可以正常工作。如果他们不一步一步 - 有时从一个读取更多的行 - next()
函数是你的朋友。有了它,您可以设置迭代器,然后在程序流程中随时请求新行。