Сравнение двух файлов и запись разницы в третий файл в цикле python
Задача состоит в том, чтобы сравнить файлы в двух папках, названия у этих файлов одинаковое, различается только содержимое этих файлов. После сравнения мне нужно оставить только разницу между двумя файлами и записать её в файл с тем же именем, как у сравниваемых, например:
Файл text1.txt из папки folder1
text1
text2
Файл text1.txt из папки folder2
text1
text2
text3
На выходе хочу получить файл text1.txt в папку folder3 с уникальным содержимым
text3
На выходе получается, что есть три папки и в каждой из них одинаковое количество файлов(в folder3 файлы могут быть пустые), только в folder3 внутри файлов остается только разница между файлами из двух других папок
Моя реализация задачи:
for file in glob.glob(os.path.join(old_path, '*.po')):
po_file = polib.pofile(file)
for i in po_file:
old_texts[i.msgid] = i.msgstr
for file in glob.glob(os.path.join(new_path, '*.po')):
po_file = polib.pofile(file)
for i in po_file:
new_texts[i.msgid] = i.msgstr
# оставляем только новые строки при сравнении двух файлов
diff_po_file = {k: new_texts[k] for k in set(new_texts) - set(old_texts)}
Сейчас у меня происходит запись уникальных текстов из двух папок в один общий файл:
with open(filename, 'w') as f:
for key, value in diff_po_file.items():
f.write('msgid "{}"\nmsgstr "{}"\n\n'.format(key, value))
Как можно реализовать запись уникальных текстов в файл с таким же именем, какое было при сравнении, как это показано в примере?
UPD: Либо как вариант сделать проверку на наличие разницы между файлами чтобы не оставлять пустые файлы, например(псевдокод):
if diff_po_file:
with open(filename, 'w') as f:
for key, value in diff_po_file.items():
f.write('msgid "{}"\nmsgstr "{}"\n\n'.format(key, value))
Ответы (2 шт):
Как можно реализовать запись уникальных текстов в файл с таким же именем, какое было при сравнении, как это показано в примере?
-- Исправить логику программы. Сейчас вы вообще нигде (я по крайне мере не вижу где) проверяете "одинаковость" имен первого и второго файла.
Не ясно, может-ли быть ситуация, когда имена в ваших первой и второй папке не совпадают? Надо-ли это проверять?
Предположим, что не надо, т.е. имена файлов в фолдерах одинаковы. Тогда логика должна быть следующая:
- глобальный цикл просматривает все файлы первой папки последовательно.
- для каждого файла открывается он сам (на четние), файл с таким-же именем из второй папки (на чтение) и файл с тем-же именем в третьей папке (на запись), если последнего нет - он создается.
- выявляются уникальные элементы (это у вас написано)
- полученные уникальные элементы записываются в третьий файл.
- все три файла закрываются.
Если же в папках могут быть файлы с несовпадающими именами - надо брать пересечение этих имен и работать только с файлами, попавшими в это пересечение. Исправление коснуться начальной части алгоритма.
Перевести на Python, надеюсь, сможете самостоятельно.
Решил задачу следующим путем:
- Разбил задачу на функции (чтение, дифф, запись)
- При чтении идет запись данных из файла в словарь (в моем случае)
- Дифф между двумя словарями (один на каждый файл) с помощью множеств, как в самом вопросе
- Записал полученный дифф в файл с таким же именем, как в п.1
- Добавил сие творение в цикл
def read_file(filename):
texts = {}
po_file = polib.pofile(filename)
for i in po_file:
texts[i.msgid] = i.msgstr
return texts
def diff_files(file1, file2):
f_1 = read_file(file1)
f_2 = read_file(file2)
content = {k: f_2[k] for k in set(f_2) - set(f_1)}
return content
def write_file(filename, content):
with open(filename, 'w') as f:
for key, value in content.items():
f.write('msgid "{}"\nmsgstr "{}"\n\n'.format(key, value))