сравнение файлов в списке - PullRequest
0 голосов
/ 08 мая 2018

У меня есть список путей к файлам. К каждому элементу списка я добавляю две строки A и B, так что абсолютный путь к файлам: file1 = A + listelemet и file2 = B + listelement. Мне нужно проверить, идентичны ли файлы. Если идентичны, игнорируйте. Если не совпадают, выведите номера строк и покажите сравнение этих строк для заданных номеров строк.

Я пробовал что-то вроде этого:

with open(file1, 'r') as filea:
    with open(file2, 'r') as fileb:
        diff = difflib.unified_diff(filea.readlines(),fileb.readlines(),fromfile=os.path.basename(file1),tofile=os.path.basename(file2))
        for line in diff:
            sys.stdout.write(line)

, но он не дает консолидированного вывода для каждого номера строки, который отличается в одном или обоих файлах

Предположим, у меня есть текстовый файл с:

a
s
s
s
d





ssasa

и еще одно со следующим:

a
s
d
ere

ewrwer

werewr

Я получаю вывод как:

--- asd.txt
+++ asd1.txt
@@ -1,11 +1,8 @@
 a
 s
-s
-s
 d
+ere

+ewrwer

-
-
-
-ssasa+werewr

Однако мне нужен вывод с напечатанным номером строки, а затем разница в этой строке для каждого файла

Желаемый вывод в консоли:

Comparing files file1 and file2


    3:  file1:s,file2:d
    4:  file1:s, file2:ere
    5:  file1:d
    6:  file2:ewrwer
    8:  file2:werewr
   11:  file1:ssasa

1 Ответ

0 голосов
/ 08 мая 2018

Учитывая желаемый результат, вы можете использовать filecmp и следующую функцию:

import filecmp
from itertools import izip_longest

def file_differences(file1, file2):
    with open(file1, 'r') as f1, open(file2, 'r') as f2:
        for i, lines in enumerate(izip_longest(f1.readlines(), f2.readlines(), fillvalue='')):
            lines = map(lambda s: s.rstrip(), lines)
            if lines[0] != lines[1]:
                out = []
                for f, line in zip((file1, file2), lines):
                    s = f + ': ' + line if line else ''
                    out.append(s)
                sep = ', ' if out[0] and out[1] else ''
                string = out[0] + sep + out[1]
                print('{0}: {1}'.format(i+1, string))


if not filecmp.cmp('file1.txt', 'file2.txt'):
    file_differences('file1.txt', 'file2.txt')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...