Python — сравните содержимое нескольких текстовых файлов с основным файлом построчно и выведите разницу

#python

Вопрос:

У меня есть некоторые проблемы в моей программе. Я пытался придумать скрипт, который сравнивает текстовые файлы с основным текстовым файлом, и программа выводит разницу.

В принципе, это конфигурация сети, и нам нужно сравнить их оптом, чтобы убедиться, что все устройства имеют стандартные конфигурации. Например, скрипт должен прочитать каждый файл (файл1, файл2..и т.д.) строка за строкой и сравнить его с основным файлом (master.txt).

Я могу сравнивать по одному файлу за раз, однако при сравнении двух или более файлов я получаю ошибку «индекс вне диапазона».

Я хочу сравнить несколько файлов, возможно, в сотнях, поэтому мне нужно знать, как исправить его цикл. Поймите, что это может быть связано с тем, что программа пытается подготовиться

 import difflib
import sys
hosts0 = open("C:\Users\p1329760\Desktop\Personal\Python\Projects\sample\master.txt","r")
hosts1 = open("C:\Users\p1329760\Desktop\Personal\Python\Projects\sample\file1.txt","r")
hosts2 = open("C:\Users\p1329760\Desktop\Personal\Python\Projects\sample\file2.txt","r")

lines1 = hosts0.readlines()
#print(lines11)

with open('output_compare.txt', 'w') as f:
    #global original_stdout 

    
    for i,lines2 in enumerate(hosts1):
        if lines2 != lines1[i]:
            original_stdout = sys.stdout
            sys.stdout = f   
            print("line ", i, " in hosts1 is different n")
            print(lines2)
            sys.stdout = original_stdout       
        else:
            pass

with open('output_compare1.txt', 'w') as file:
    
    for i,lines3 in enumerate(hosts2):
        if lines3 != lines1[i]:
             original_stdout = sys.stdout
             sys.stdout = file   
             print("line ", i, " in hosts1 is different n")
             print(lines3)
             sys.stdout = original_stdout
        else:
             pass
 

Комментарии:

1. Ваш код очень повторяющийся и в идеале должен использовать список хостов, по которому вы выполняете итерации для сравнения. Кроме того, существуют всевозможные очень эффективные программы для разделения текста.

2. Вероятно, вы не получили ошибку «вне индекса». Это был «индекс списка вне диапазона». Важно включать сообщения об ошибках дословно. Вы также не сообщили нам, где произошла ошибка (в какой строке кода).

3. diff3 Команда может это сделать, программирование не требуется.

4. @jarmod , да, пропустил, что ошибка «индекс вне диапазона», и это происходит в том случае, если строки 3 != строки 1[i]: .

5. @TimRoberts, я пытаюсь использовать это приложение для сравнения 100 файлов с основным файлом. Думаю, что diff3 может содержать только 3 файла одновременно.

Ответ №1:

Привет, вот что ты мог бы сделать:

У вас может быть список всех имен файлов

namefile = [....]

И функция, которая принимает имя файла

 def compare (filename):
    fileobj = open(filename)
    infile = fileobj.read().split()
    for i in range(0,len(infile)):
        if infile[i] == masterin[i]:
            pass
        else:
            print(...)
 

После этого вам необходимо открыть главный файл

 master = open( "...")
masterin = master.read().split()
 

После этого цикл, и все готово

  for i in namefile:
    compare (i)