用python比较两个文件行

时间:2014-09-30 18:14:21

标签: 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

知道我在这里做错了什么吗?

请注意:我不想只是将整行相互比较以检查它们是否相同,我需要先做一些字符串操作,所以拉链和这样的东西不会帮助我。谢谢

提前致谢

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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()。"