2014-09-30 87 views
0

这听起来有点愚蠢,但我一直很难找出它。我有两个文本文件,我只想将第一个文件的每一行与第二个文件的所有行进行比较。到目前为止,我只是想测试我的代码一小部分是:比较两个文件行与python

for line1 in file1: 
    print line1 
    for line2 in file2: 
     print line2 

我想这个小码会给我从第一个文件,然后从第二个文件中的所有行线。但它的工作方式完全不同。它给了我这样的:

in file 1 line 1 
in file 2 line 1 
in file 2 line 2 
in file 2 line 3 
in file 1 line 2 

我希望看到:

in file 1 line 1 
in file 2 line 1 
in file 2 line 2 
in file 2 line 3 

in file 1 line 2 
in file 2 line 1 
in file 2 line 2 
in file 2 line 3 

的我可能是错在这里做任何想法?

请注意:我不想只比较整个行与对方,以检查它们是否相同,我需要做一些字符串操作之前,所以压缩和类似的东西不会帮助我。在此先感谢

感谢

+0

您确定脚本中的缩进与您在此处的缩进方式相同吗?您发布的代码应该按照您的预期行事 - 打印第一行'file1',打印所有'file2',打印第二行'file1',打印所有'file2'等。 – MackM 2014-09-30 18:20:25

+0

@MackM是我是在肯定这是我得到的结果是: 文件1行1 文件2线1 文件2行2 文件2线3 文件1线2 – ahajib 2014-09-30 18:23:57

+0

@ddenhartog这不是因为最后的线,是我的第一个文件中的第二行应从第二个文件的所有行后面:) – ahajib 2014-09-30 18:33:33

回答

3

这里发生的事情是一个文件是一个迭代器,并且你已经用尽了它(用完了)。你可以看到,通过在同一个文件两次试图循环:

>>> f2=open("CLI.md") 
>>> for i in f2: 
...  print(i) 
... 
The CLI 
(file contents...) 
>>> for i in f2: 
...  print(i) 
... 
>>> 

的处理,这里是第一次将文件转换成内循环到列表循环之前,最好的办法:

file2_lines = list(file2) 
for line1 in file1: 
    print line1 
    for line2 in file2_lines: 
     print line2 

另请参阅:exhausted iterators - what to do about them?

+0

非常感谢你 – ahajib 2014-09-30 19:16:57

+0

没问题!我可能已经用我的头撞墙了...... – matsjoyce 2014-09-30 19:18:00

0

zip可以在这里你的朋友。

例如,

for line_a, line_b in zip(file_1, file_2): 
    #do something with your strings 

样品终端编码:

>>> file_1 = ['a', 'b', 'c', 'd'] 
>>> file_2 = ['a', 'one', 'c', 'd', 'e'] 
>>> for a, b in zip(file_1, file_2): 
... if a == b: 
...  print('equal!') 
... else: 
...  print('nope!') 
... 
equal! 
nope! 
equal! 
equal! 
>>> for a, b in zip(file_2, file_1): 
... print(a, b) 
... 
a a 
one b 
c c 
d d 

注意到有什么奇怪的?

根据Python Docs“zip()”只应用于不等长输入,当您不关心较长迭代中的尾随,不匹配的值时,如果这些值很重要,请使用itertools.zip_longest()。 “