Python 如何创建一个os.walk()函数来比较两个目录的文件夹和子文件夹?
我的问题是:假设我想创建一个文件同步功能,该功能将遍历两个类似目录的所有文件夹和子文件夹,并检测这两个目录的所有公共文件夹/子文件夹。我尝试将os.walk模块与filecmp模块结合起来。到目前为止,我的代码是这样的:Python 如何创建一个os.walk()函数来比较两个目录的文件夹和子文件夹?,python,for-loop,os.walk,file-comparison,Python,For Loop,Os.walk,File Comparison,我的问题是:假设我想创建一个文件同步功能,该功能将遍历两个类似目录的所有文件夹和子文件夹,并检测这两个目录的所有公共文件夹/子文件夹。我尝试将os.walk模块与filecmp模块结合起来。到目前为止,我的代码是这样的: import filecmp import os src=r"C:\Users\j2the\Documents\Test3" dst=r"C:\Users\j2the\Documents\Test4" comparison = filecmp.dircmp(dst, sr
import filecmp
import os
src=r"C:\Users\j2the\Documents\Test3"
dst=r"C:\Users\j2the\Documents\Test4"
comparison = filecmp.dircmp(dst, src)
for dirpath,dirnames,filenames in os.walk(src):
for folders in dirnames:
if folders in comparison.common_dirs:
print(folders)
src_folder=os.path.abspath(os.path.join(dirpath,folders))
dst_folder=os.path.abspath(os.path.join(dst,folders))
folder_comparison = filecmp.dircmp(dst_folder, src_folder)
for dirpath1,dirnames1,filenames1 in os.walk(src_folder):
for subfolders in dirnames1:
if subfolders in folder_comparison.common_dirs:
print(subfolders)
src_subfolder=os.path.abspath(os.path.join(dirpath1,subfolders))
dst_subfodler=os.path.abspath(os.path.join(dst_folder,subfolders))
subfolder_comparison=filecmp.dircmp(dst_subfodler,src_subfolder)
这是一个非常简单的代码。但是,此代码仅适用于最多有2个子文件夹的目录。如果我想分析包含更多子文件夹的目录,我必须在代码中添加大量嵌套循环。当然还有另一种方法,对吗?我在考虑创建一个while循环,不断遍历每个子文件夹,并对它们进行比较,直到没有剩下子文件夹为止,但我就是不知道怎么做。如有任何帮助/意见,将不胜感激 这是一个简单有效的技巧(在mac上测试)。walk函数返回目录树的生成器,该生成器可以生成一个列表。但是,由于根目录名可能不同,我删除了每个列表项中的第一个元素 编辑:这只是比较目录结构,而不是内容
res1 = [r[1:] for r in os.walk(src)]
res2 = [r[1:] for r in os.walk(dst)]
comparison = res1 == res2
您不需要
filecmp.dircmp
。相反,使用要比较的两个目录调用os.walk
,zip
两个生成器的输出,并在输出中的两个子目录上使用set intersection来查找公共子目录
请注意,进行递归遍历的关键是对两个生成器返回的子目录执行就地替换,以便只保留两个当前目录共有的子目录,以便进行更深入的遍历和进一步的比较:
import os
for (root1, dirs1, _), (root2, dirs2, _) in zip(os.walk('dir1'), os.walk('dir2')):
dirs1[:] = dirs2[:] = set(dirs1).intersection(dirs2)
for common_dir in dirs1:
print('Common sub-directory of {} and {}: {}'.format(root1, root2, common_dir))
根据以下文件:
当top-down
为True
时,调用者可以就地修改dirnames
列表
(可能使用del
或slice赋值)和walk()
只会重复出现
进入名称保留在dirnames
中的子目录;这可能是
用于删除搜索
不是为每个子文件夹生成一个元组吗?