gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:14:41 26 4
gpt4 key购买 nike

尝试将我们当前的项目媒体服务器 (dir1) 与备份 (dir2) 进行比较,以查看删除了哪些文档。两者都是 Windows 目录。许多文件已被转移到新的子目录中,但并未丢失。因为目录结构已使用递归更改,并且 filecmp.dircmp 根据这篇文章将不起作用: Recursively compare two directories to ensure they have the same files and subdirectories

另一个考虑因素是不同的文件会有相同的文件名,因此比较需要比较文件大小、修改日期等来确定两个文件是否相同。

我想要什么 sudo 代码:

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 中查找它?

最佳答案

我可以建议一个替代方案吗?使用 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

关于python - 使用 python 比较两个目录中的文件以查找一个目录中的文件而不是另一个目录中的文件 - 与子目录结构无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58530413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com