2016-03-03 3 views
2

У меня есть эта программа, которая просто берет два файла и сравнивает их по строкам. Он отлично работает, если оба файла имеют одинаковое количество строк. Моя проблема была бы в том, что, если, например, file2 имеет больше строк, чем file1? Или наоборот. Когда это происходит, я получаю индекс IndexError: list вне диапазона. Что я могу сделать, чтобы учесть это?Сравнение двух файлов по строкам

#Compares two files 
def compare(baseline, newestFile): 



    baselineHolder = open(baseline) 
    newestFileHolder = open(newestFile) 



    lines1 = baselineHolder.readlines() 
    a = returnName(baseline) 
    b = returnName(newestFile) 


    for i,lines2 in enumerate(newestFileHolder): 
     if lines2 != lines1[i]: 
      add1 = i + 1 
      print ("line ", add1, " in newestFile is different \n") 
      print("TAKE A LOOK HERE----------------------TAKE A LOOK HERE") 
      print (lines2) 
     else: 
      addRow = 1 + i 
      print ("line " + str(addRow) + " is identical") 
+0

Тогда вы можете сравнивать только столько строк, сколько имеет меньший файл. –

+3

Вам нужно использовать 'python'? У Linux есть инструмент под названием 'diff' (возможно, также доступен в Win), который делает именно это. –

ответ

4

Вместо того, чтобы изобретать колесо, почему бы не использовать встроенный в difflib? Ниже приведен пример использования difflib.unified_diff из документов:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n'] 
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n'] 
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'): 
...  sys.stdout.write(line) 
--- before.py 
+++ after.py 
@@ -1,4 +1,4 @@ 
-bacon 
-eggs 
-ham 
+python 
+eggy 
+hamster 
guido 
1

Возможно, вы можете использовать itertools.izip_longest. Если одна последовательность была исчерпана, она излучает какое-то значение заполнения (по умолчанию None):

import itertools 

for l, r in itertools.izip_longest(open('foo.txt'), open('bar.txt')): 
    if l is None: # foo.txt has been exhausted 
     ... 
    elif r is None: # bar.txt has been exhausted 
     ... 
    else: # both still have lines - compare now the content of l and r 
     ... 

Редактировать Как @danidee правильно отмечает, для PY3 это zip_longest.

+0

Я обязательно посмотрю на это –

+0

@Ami Tavory ... Следует отметить, что это 'itertools.zip_longest' в' py3x' – danidee

+0

@ danidee Вы правы. Большое спасибо. –

1

Вы должны поймать IndexError, а затем остановить ваше сравнение

for i,lines2 in enumerate(newestFileHolder): 
     try: 
      if lines2 != lines1[i]: 
       add1 = i + 1 
       print ("line ", add1, " in newestFile is different \n") 
       print("TAKE A LOOK HERE----------------------TAKE A LOOK HERE")  
       print (lines2) 
      else: 
       addRow = 1 + i 
       print ("line " + str(addRow) + " is identical") 
     except IndexError: 
      print("Exit comparison") 
      break 
Смежные вопросы