Доброе утро всем, Я пытаюсь сравнить два файла .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)
Есть два способа сделать это.
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'
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
работал правильно.
Разве вы не можете, глядя на начало каждой строки, определить, печатать ее или нет?