使用python进行文件比较

时间:2011-10-14 12:46:22

标签: python

我有两个文本文件

文件1:

1234
13454
93837
82739

file2的:

comp i
93837 -4.52
82739 -2.2
1234 -2.36
13454 -2.25

我尝试了一个python脚本来比较文件,理想情况下应该跟踪搜索CID 从file2中的file1并将i值附加到file1。但不幸的是它没有用。

file1=open("f1.txt","r")
file2=open("f2.txt","r")
for line1 in file1.readlines():
  for line2 in file2.readlines():
    if line1 in line2:
      print line2

5 个答案:

答案 0 :(得分:3)

这是一个可行的解决方案,可以尽可能少地修改您的原件:

file1=open("f1.txt","r")
file2=open("f2.txt","r")

list1 = file1.readlines()
list2 = file2.readlines()
for line1 in list1:
  for line2 in list2:
    if line1.strip() in line2.strip().split(' '):
      print line2

答案 1 :(得分:2)

你有两个问题。

第一个是file1.readlines()返回每行,包括回车符。 file2.readlines()的结果永远不会出现这种情况,因为您的代币出现在该行的开头。

第二个是您为file2的每一行迭代file1。毋庸置疑,这不是最有效的方法,但即使你想保持这种方式,你需要在迭代之前执行file2.seek(0),否则如果文件出来你将无法匹配因为它只会真正迭代file2一次。

总而言之,这是与您发布的所需工作的最小偏差(但是,我会提醒您,确实有更好的方法来实现您的目标,并且可能需要几分钟时间才能考虑只是用这个):

for line1 in file1.readlines():
  file2.seek(0)
  for line2 in file2.readlines():
   if line1.strip() in line2:
      print line2

答案 2 :(得分:0)

无需使用readlines,您可以遍历文件:

with open('f1.txt') as f1:
  ids = set(line.1strip() for line1 in f1)

with open('f2.txt') as f2:
  for line2 in f2:
    comp,i = line2.strip().split(' ')
    if comp in ids:
      print(line2)

答案 3 :(得分:0)

for count, line in enumerate(itertools.izip(file1, file2), 1):
    if line[0] != line[1]:
        print "Error found on line %s" % count
        print "Line in file1: %s" % line[0]
        print "Line in file2: %s" % line[1]

使用一些额外的魔法,你不必读取整个文件,使其更有效率。您还可以使用枚举来获取行号,甚至可以使zip行为像iterable一样,因此当您只迭代每组行和行号时,不会在内存中生成整个列表。

itertools.izip对于文档。

答案 4 :(得分:0)

其他海报已经解决了为什么你的代码不能正常工作的问题,但对于更健壮的文件比较解决方案,你可能会考虑使用Python的difflib