Сравнение файлов в двух каталогах с python для поиска файлов, которые находятся в одном каталоге, но не в другом - не зависит от структуры подкаталогов - PullRequest
1 голос
/ 23 октября 2019

Попытка сравнить наш текущий медиа-сервер проекта (dir1) с резервной копией (dir2), чтобы увидеть, какие документы были удалены. Оба являются каталогами Windows. Многие файлы были перетасованы в новые подкаталоги, но не пропали. Поскольку структура каталогов изменилась с использованием recursion и filecmp.dircmp, этот пост не будет работать: Рекурсивное сравнение двух каталогов, чтобы убедиться, что они имеют одинаковые файлы и подкаталоги

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

Что мне нужно sudo-code:

def find_missing_files(currentDir, backup):
    <does stuff>
    return <List of Files in backup that are not in currentDir>

То, что у меня есть:

def build_file_list(someDir, fileList = []):
    for root, dirs, files in os.walk(someDir):
        if files:
            for file in files:
                filePath = os.path.join(root, file)
                if filePath not in fileList:
                    fileList.append(filePath)
    return fileList

def cmp_file_lists(dir1, dir2):
    dir1List = build_file_list(dir1)
    dir2List = build_file_list(dir2)

    for dir2file in dir2List:
        for dir1file in dir1List:
            if filecmp.cmp(dir1file, dir2file):
                dir1List.remove(dir1file)
                dir2List.remove(dir2file)
                break
    return (dir1List, dir2List)

РЕДАКТИРОВАТЬ: в приведенном выше коде у меня возникла проблема, из-за которой dir2List.remove (dir2file) выдает ошибку, что dir2file отсутствует в dir2List, потому что (он появляется) как-то и dir2list, иdir1List - это один и тот же объект. Не знаю, как это происходит.

Не знаю, проще ли это сделать с помощью filecmp.dircmp, но мне не хватает этого? или если это лучший подход для достижения того, что я ищу? ... или я должен взять каждый файл у dir2 и у нас из os.walk, чтобы найти его в dir1?

1 Ответ

0 голосов
/ 23 октября 2019

Могу ли я предложить альтернативу? Используя pathlib и метод rglob, все будет намного проще (если вы действительно не зависимы от подкаталогов):

from pathlib import Path

def cmp_file_lists(dir1, dir2):
    dir1_filenames = set(f.name for f in Path(dir1).rglob('*'))
    dir2_filenames = set(f.name for f in Path(dir2).rglob('*'))
    files_in_dir1_but_not_dir2 = dir1_filenames - dir2_filenames 
    files_in_dir2_but_not_dir1 = dir2_filenames - dir1_filenames 
    return dir1_filenames, dir2_filenames
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...