import os
def compare_files(file1, file2):
# Function to compare files
pass
def compare_folders(folder1, folder2):
differences_found = False
# Compare files in folder1
for root, dirs, files in os.walk(folder1):
for file in files:
file1 = os.path.join(root, file)
file2 = os.path.join(root.replace(folder1, folder2, 1), file)
if not os.path.exists(file2):
print(f"File {file} exists in {folder1} but not in {folder2}")
differences_found = True
elif os.path.isfile(file2):
# If the file exists in both folders, compare them
compare_files(file1, file2)
# Compare files in folder2
for root, dirs, files in os.walk(folder2):
for file in files:
file1 = os.path.join(root.replace(folder2, folder1, 1), file)
file2 = os.path.join(root, file)
if not os.path.exists(file1):
print(f"File {file} exists in {folder2} but not in {folder1}")
differences_found = True
if not differences_found:
print("No differences found between the files in the two folders.")
if __name__ == "__main__":
folder1 = input("Enter path to the first folder: ")
folder2 = input("Enter path to the second folder: ")
compare_folders(folder1, folder2)
Я пытаюсь сравнить файлы в обеих папках и распечатать содержимое, которое отличается друг от друга. А также имена файлов, которые в обеих папках разные.
Привет. Я пытаюсь сравнить файлы в двух папках. Но мой сценарий не печатает все файлы, которые отличаются. Например, у меня есть 8 файлов. 6 одинаковы в обеих папках. У меня есть 2 файла в папке 1 и еще 2 в папке 1, но вместо этого pf показывает мне все разные файлы, он показывает по одному имени файла для каждой папки, которая отличается. Другие файлы с другим именем @ не читаются — PM 77-1
Как я предложил, отредактируйте свой вопрос и включите туда описание проблемы.
Есть несколько проблем с кодом:
compare_files
в настоящее время не проводит никаких сравнений. Сначала следует сравнить два входных файла на предмет размера и только затем проверить, одинаково ли их содержимое. Он должен возвращать True или False в зависимости от того, равны ли файлы при сравнении, и это возвращаемое значение следует использовать для установки differences_found
.def compare_folders(folder1, folder2):
differences_found = False
# Compare files in folder1
for root, dirs, files in os.walk(folder1):
for file in files:
file1 = os.path.join(root, file)
file2 = os.path.join(root.replace(folder1, folder2, 1), file)
if not os.path.exists(file2):
print(f"File {file} exists in {folder1} but not in {folder2}")
differences_found = True
elif os.path.isfile(file2):
# If the file exists in both folders, compare them
compare_files(file1, file2)
...
Я считаю, что это должно быть:
def compare_folders(folder1, folder2):
differences_found = False
# Compare files in folder1
for root1, dirs, files in os.walk(folder1):
for file in files:
file1 = os.path.join(root1, file)
root2 = root1.replace(folder1, folder2, 1)
file2 = os.path.join(root2, file)
if not os.path.isfile(file2):
print(f"File {file} exists in {root1} but not in {root2}")
differences_found = True
else:
# If the file exists in both folders, compare them
if not compare_files(file1, file2):
print(f"Files {file} differ in {root1} and {root2}")
differences_found = True
...
Это не только распечатывает полные пути к файлам, начиная с исходных папок, но и исправляет небольшую ошибку: что, если у нас есть файлfolder1/a/b/test, но папка2/a/b/test существует, но вместо этого это каталог файла. Ваш текущий файл не будет показывать, что файл test существует в одном каталоге, но не в другом, и не будет установлен флаг differences_found
.
Я предоставил реализацию compare_files
в полном коде ниже:
import os
import mmap
def compare_files(file1: str, file2: str) -> bool:
"""Function to compare files."""
with open(file1, 'rb') as f1, open(file2, 'rb') as f2:
size1 = f1.seek(0, 2)
size2 = f2.seek(0, 2)
if size1 != size2:
return False
if size1 == 0:
return True
with mmap.mmap(f1.fileno(), 0, access=mmap.ACCESS_READ) as mm1, \
mmap.mmap(f2.fileno(), 0, access=mmap.ACCESS_READ) as mm2:
return mm1[0:] == mm2[0:]
def compare_folders(folder1: str, folder2: str) -> None:
differences_found = False
# Compare files in folder1
for root1, dirs, files in os.walk(folder1):
for file in files:
file1 = os.path.join(root1, file)
root2 = root1.replace(folder1, folder2, 1)
file2 = os.path.join(root2, file)
if not os.path.isfile(file2):
print(f"File {file} exists in {root1} but not in {root2}")
differences_found = True
else:
# If the file exists in both folders, compare them
if not compare_files(file1, file2):
print(f"Files {file} differ in {root1} and {root2}")
differences_found = True
# Compare files in folder2
for root2, dirs, files in os.walk(folder2):
for file in files:
root1 = root2.replace(folder2, folder1, 1)
file1 = os.path.join(root1, file)
file2 = os.path.join(root2, file)
if not os.path.isfile(file1):
print(f"File {file} exists in {root2} but not in {root1}")
differences_found = True
if not differences_found:
print("No differences found between the files in the two folders.")
if __name__ == "__main__":
folder1 = input("Enter path to the first folder: ")
folder2 = input("Enter path to the second folder: ")
compare_folders(folder1, folder2)
Приведенный выше код работает для меня, поэтому, если у вас все еще возникают трудности, вам нужно явно показать минимальные структуры каталогов, которые не дают ожидаемых результатов, а также то, каков ваш ожидаемый результат и что вы на самом деле отображаете.
Спасибо! Но все равно не отображаются все файлы, которые я добавил в папку 1 и папку 2. например, в папке 1 есть файлы test.txt и test1.txt, а в папке 2 — test3.txt. Но вывод, напечатанный как test.txt, находится в папке 1, а не в папке floder2. О других файлах речи не шло.
Я хочу, чтобы сценарий прошел через папку 1 и папку 2. Распечатайте любые различия, например любые дополнительные файлы, которых нет в другом каталоге. Также, если файлы с одинаковыми именами находятся в двух каталогах, если они имеют различия, распечатайте содержимое, которое отличается.
Вы сказали, например, что в папке 1 есть файлы test.txt и test1.txt, а в папке 2 — test3.txt. Но вывод, напечатанный как test.txt, находится в папке 1, а не в папке floder2. Совершенно верно: test.txt нет в папке 2, в которой есть только test3.txt, как вы только что написали. Вы хотите сказать, что он также должен был указать, что test1.txt отсутствует в папке 2, но этого не произошло?
Все работает нормально. Он может печатать файлы, которых нет в другом каталоге или папке. Кроме того, он распечатывает имена файлов, которые имеют разное содержимое с тем же именем файла в другой папке. Теперь я пытаюсь распечатать содержимое, которое в обеих папках разное. Есть какие-нибудь советы по этому поводу?
Я не уверен, о чем вы спрашиваете. Что вы подразумеваете под «распечатать содержимое»? Вы имеете в виду построчный отчет о различиях?
Привет @Booboo да, я хочу, чтобы сценарий читался построчно и выдавал выходные данные, которые были добавлены в файлы папки 2, которые также присутствуют в папке 1, но содержимое другое. Я хочу, чтобы он печатал только разницу, а не все.
Теперь это новое требование. В Linux есть утилита diff
, которая выполняет построчное сравнение. На других платформах вы можете загрузить общедоступные версии diff
. Затем необходимо вызвать утилиту, указав пути к сравниваемым файлам. Для этого посмотрите subprocess.Popen
. Затем, если у вас возникнут трудности с запуском этого вопроса, опубликуйте новый вопрос со своей попыткой (вы можете оставить здесь комментарий со ссылкой на новый вопрос, и я постараюсь его рассмотреть). На данный момент, если я решил вашу первоначальную проблему, рассмотрите возможность принятия моего ответа.
да, вы решили мой первоначальный вопрос. Спасибо
Не благодари меня. Вместо этого примите ответ. Посмотрите ссылку, которую я дал в предыдущем комментарии.
Каков именно ваш вопрос? Возможно, вы захотите отредактировать свой пост для большей ясности.