使用python比较两个目录中的文件,以查找一个目录中的文件,而不是另一个目录中的文件-与子目录结构无关

使用python比较两个目录中的文件,以查找一个目录中的文件,而不是另一个目录中的文件-与子目录结构无关,python,python-3.x,windows,directory,Python,Python 3.x,Windows,Directory,正在尝试将当前project media server(dir1)与备份(dir2)进行比较,以查看删除了哪些文档。两者都是windows目录。 许多文件已被重新排列到新的子目录中,但并没有丢失。因为使用递归和filecmp.dircmp更改了目录结构,所以此帖子不起作用: 其他注意事项是,不同的文件将具有相同的文件名,因此比较需要比较文件大小、修改日期等,以确定两个文件是否相同 我想要的sudo代码: def find_missing_files(currentDir, backup):

正在尝试将当前project media server(dir1)与备份(dir2)进行比较,以查看删除了哪些文档。两者都是windows目录。 许多文件已被重新排列到新的子目录中,但并没有丢失。因为使用递归和filecmp.dircmp更改了目录结构,所以此帖子不起作用:

其他注意事项是,不同的文件将具有相同的文件名,因此比较需要比较文件大小、修改日期等,以确定两个文件是否相同

我想要的sudo代码:

def find_missing_files(currentDir, backup):
    <does stuff>
    return <List of Files in backup that are not in currentDir>
编辑:在上面的代码中,我遇到了一个问题,dir2List.remove(dir2file)抛出错误,dir2file不在dir2List中,因为(看起来)dir2List和dir1List是同一个对象。不知道这是怎么发生的

我不知道这是否可以用filecmp.dircmp更容易地完成,但我错过了它?或者这是实现我所追求的目标的最佳途径?
…或者我应该从dir2和us os.walk中获取每个文件以在dir1中查找它吗?

我可以推荐一个替代方案吗?使用
pathlib
及其
rglob
方法,一切都会简单得多(如果您确实不知道子目录):


我可以推荐一个替代方案吗?使用
pathlib
及其
rglob
方法,一切都会简单得多(如果您确实不知道子目录):


用这个做实验。。。但它不只是比较文件名吗?我将有不同的文件具有相同的文件名(显然在不同的目录中),因此使用filecmp.cmp的原因是它寻找其他的统计数据来比较…我认为。它还应该返回文件\u in_dir2\u但不是\u dir1和文件\u in_dir1\u但不是\u dir2,否?@constdocconstdoc它将只比较名称,这是真的,但您没有指定
filecmp.cmp
的作用。您可以始终将该级别的比较添加到此代码中,或者,将文件与集合中不仅仅是
name
的文件进行比较。这里的基本思想是向您展示一种在目录中搜索的替代方法,您如何使用它取决于您我很感激您强调了一种构建文件列表的方法,但是比较文件是这里的问题。尽管如此,如果我最终使用文件列表,这可能有助于建立列表。。。但它不只是比较文件名吗?我将有不同的文件具有相同的文件名(显然在不同的目录中),因此使用filecmp.cmp的原因是它寻找其他的统计数据来比较…我认为。它还应该返回文件\u in_dir2\u但不是\u dir1和文件\u in_dir1\u但不是\u dir2,否?@constdocconstdoc它将只比较名称,这是真的,但您没有指定
filecmp.cmp
的作用。您可以始终将该级别的比较添加到此代码中,或者,将文件与集合中不仅仅是
name
的文件进行比较。这里的基本思想是向您展示一种在目录中搜索的替代方法,您如何使用它取决于您我很感激您强调了一种构建文件列表的方法,但是比较文件是这里的问题。尽管如此,如果我最终使用文件列表,这可能有助于构建列表。
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)
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