Python中查找两条给定路径之间公共文件的有效方法

2024-07-01 07:19:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了代码来找出两个给定文件夹(路径)之间的公共文件,这些文件占所有级别的子文件夹(如果存在的话)。在

请建议是否有更有效的方法。如果给定具有多个子文件夹级别的文件夹,则花费的时间太长。在

def findCommonDeep(self,path1,path2):
    commonfiles = []

    for (dirpath1, dirname1, filenames1) in os.walk(path1):
        for file in filenames1:
            for (dirpath2, dirname2, filenames2) in os.walk(path2):
                if (file in filenames2 and isfile(join(dirpath2, file))):
                        commonfiles.append(file)

    print(commonfiles)

并使用路径调用此函数,如下所示:

^{pr2}$

我知道,如果我为任何给定的路径存储一个所有文件的列表,那么执行速度就会降低。但我想那会耗尽你的记忆。请引导我更有效地处理这个问题。在


Tags: 文件in路径文件夹foros级别file
1条回答
网友
1楼 · 发布于 2024-07-01 07:19:38

可以使用生成器表达式将os.walk的输出转换为两个集合,并使用集合交集有效地标识公共路径。在

import os
def findCommonDeep(path1, path2):
    files1 = set(os.path.relpath(os.path.join(root, file), path1) for root, _, files in os.walk(path1) for file in files)
    files2 = set(os.path.relpath(os.path.join(root, file), path2) for root, _, files in os.walk(path2) for file in files)
    return files1 & files2

要减少上述代码中的代码重复,可以使用另一个列表理解:

^{pr2}$

如果只查找公共文件名而不是公共路径名,则可以使生成器表达式只输出文件名:

def findCommonDeep(path1, path2):
    return set.intersection(*(set(file for _, _, files in os.walk(path) for file in files) for path in (path1, path2)))

这是更有效的,因为它利用了Python的set intersection操作,它的平均值为O(min(len(n), len(m)),而具有2个嵌套循环的代码总是使用O(n^2)。在

相关问题 更多 >

    热门问题