python - 在 Python 中的两个给定路径之间查找公共(public)文件的有效方法

标签 python file operating-system

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

如果有更有效的方法,请提出。如果给出的文件夹包含很多级别的子文件夹,则花费的时间太长。

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)

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

findCommonDeep("/home/naseer/Python", "/home/naseer/C")

我知道如果我为任何给定路径存储所有文件的列表,执行速度会降低。但我想那会耗尽内存。请指导我更有效地解决这个问题。

最佳答案

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

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

为了减少上面代码中的代码重复,你可以使用另一种列表理解:

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

如果您只查找通用文件名而不是通用路径名,您可以让生成器表达式只输出文件名:

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 的集合交集操作,其平均 time complexity O(min(len(n), len(m)),而带有 2 个嵌套循环的代码总是需要 O(n^2)

关于python - 在 Python 中的两个给定路径之间查找公共(public)文件的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51625336/

相关文章:

python - Matplotlib 粗动画,显示轨迹

python - 选择性 python 字符串替换

c - 如何根据c中的位置打印字符串?

linux - 根据分页分段存储器的程序生命周期

c - 为什么 fork() 的输出是特定顺序的?

python - 无法安装flask-mysqldb

python - 在 python setup.py egg_info 上使用 pip 中断安装

java - 如何从 HTML 输入读取 Excel 文件内容?

c++ - 使用 QTextStream 读取正在写入的文件?

linux - Windows 上的系统调用天生就比 Linux 慢吗?