Сравнить два файла и вернуть только изменения из второго

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

Можно ли сделать это? Я оставляю код ниже

Большое спасибо

Например, у меня есть файл1 с этим:

The Last Late Night (2023) [4k 2160p][Esp]
Rabos The Musical (2023) [4k 2160p][Esp]

И у меня есть файл2 с этим:

Fancy Dance (2023) [4k 2160p][Esp]
The Last Late Night (2023) [4k 2160p][Esp]

Когда я сравниваю их, он возвращает:

different
--- file.txt
+++ file1.txt
@@ -0.0 +1 @@
+Fancy Dance (2023) [4k 2160p][Esp]

@@ -2 +2.0 @@
-Rabos The Musical (2023) [4k 2160p][Esp]

И единственное, что я хотел бы, чтобы он мне вернул, это: другой +Необычный танец (2023) [4k 2160p][Esp]

Мне не интересно знать, что пропало в файле1, то есть что с ним выходит — ни то, что выходит с @@ и имена файлов тоже

# BOOKSTORES
import difflib
import filecmp
import sys
import requests

# WE COMPARE THE TWO FILES.
with open('file1.txt', encoding='utf8') as file_1: 
    file_1_text = file_1.readlines() 

with open('file2.txt', encoding = "utf8") as file_2: 
    file_2_text = file_2.readlines() 

    iguales = filecmp.cmp('file1.txt', 'file2.txt')
if iguales:
    print("Equal")
    sys.exit(1)
else:
    print("different")  

    # WE LOOK FOR THE DIFFERENCES AND PRINT THEM.
    for line in difflib.unified_diff( 
            file_1_text, file_2_text, fromfile='file1.txt',  
            tofile='file2.txt', n=0, lineterm=''): 
        print(line) 

    def telegram_bot_sendtext(bot_message):

                bot_token = 'YOUR TOKEN'
                bot_chatID = 'YOUR CHAT ID'
                send_text = 'https://api.telegram.org/bot' + bot_token + '/sendMessage?chat_id=' +       bot_chatID + '&parse_mode=Markdown&text=' + bot_message

                response = requests.get(send_text)

                return response.json()


    test = telegram_bot_sendtext(line)

sys.exit(1)

Разве вы не можете, глядя на начало каждой строки, определить, печатать ее или нет?

Scott Hunter 01.07.2024 17:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть два способа сделать это.

  1. Используйте свой собственный сценарий, что-то вроде этого. Это вернет iterator над теми строками, которые есть только во втором файле.
from collections.abc import Iterator


def compare(
        filename1: str,
        filename2: str,
        lineterm: str = '\n') -> Iterator[str]:

    def read_lines(filename: str) -> Iterator[str]:
        with open(filename) as file:
            for line in file.readlines():
                yield line + '\n' if not line.endswith('\n') else line

    file1_lines = set(read_lines(filename1))
    file2_lines = set(read_lines(filename2))
    for current_line in file2_lines - file1_lines:
        yield f'+{current_line[:-1]}{lineterm}'

#  '+Fancy Dance (2023) [4k 2160p][Esp]\n'
  1. Получите результат функции difflib.unified_diff и отфильтруйте строки, которые следует игнорировать:
def patched_unified_diff(
       a,
       b,
       fromfile='',
       tofile='',
       fromfiledate='',
       tofiledate='',
       n=3,
       lineterm='\n') -> Iterator[str]:

   it = unified_diff(
       a,
       b,
       fromfile,
       tofile,
       fromfiledate,
       tofiledate,
       n,
       lineterm,
   )
   for result_line in it:
       first_three = result_line[:3]
       if first_three.startswith('+') and not first_three.startswith('+++'):
           yield result_line

#  '+Fancy Dance (2023) [4k 2160p][Esp]\n'

Это работает аналогично, возвращая те же результаты. Единственное, что у вас должен быть разрыв строки в конце ваших файлов, чтобы difflib.unified_diff работал правильно.

Другие вопросы по теме