【问题标题】:Fastest way to search files in a directory -Python在目录中搜索文件的最快方法-Python
【发布时间】:2018-08-30 13:57:22
【问题描述】:

我有一个多个目录,每个目录都有数千个(10k+)文件。让我们选择一个目录A 有 10k 个文件。我有另一个目录(说它为B),其中包含数千个文件。我正在尝试查找出现在AB 中的所有文件,并且还具有特定的文件扩展名(比如说.docx)。我可以轻松地应用嵌套的 for 循环,但由于文件数以千计,因此需要大量时间。 python中有没有更快的方法来执行它?您想建议任何特定的算法或任何 sn-p 代码?

注意 - 我知道如何以多种方式搜索和获取文件,我正在寻求最快方法的建议,文件数以百万计,一次又一次地遍历每一个都将消耗资源..

【问题讨论】:

  • 你可以使用 glob 或者简单的 os.listdir
  • 我知道要搜索,我正在寻找最快的方法,不。的文件几乎有 50 万,分布在每个目录中..
  • @jolindbe 我不认为那是我正在寻找你提到的链接..请再次检查我的问题...
  • 如果你举一个更具体的例子可能会有所帮助。显示A 中的一些文件、B 中的一些文件的示例,以及您期望的结果和原因。

标签: python pandas


【解决方案1】:

在python中比较目录的规范方法似乎是filecmp.dircmp()

cmp = filecmp.dircmp('/path/to/A', '/path/to/B')
matchingfiles = [filename for filename in cmp.common_files if filename.endswith('.docx')]

我无法具体谈论它的性能,但我认为它的实现方式比嵌套的for 循环更有效。

【讨论】:

  • 它比 glob 好吗?根据问题所说的更快吗?
【解决方案2】:

你可以这样:

import os
[x for x in os.listdir('A') if x.endswith('.docx')]

这将选择“A”文件夹中的“.docx”文件。

【讨论】:

    【解决方案3】:

    试试glob 模块:

    import glob
    glob.glob('/*')
    

    输出(Ubuntu 18.04):

    ['/bin', '/boot', '/cache', '/data', '/dev', '/etc', '/home', '/init', '/lib', '/lib64', '/media', '/mnt', '/opt', '/proc', '/root', '/run', '/sbin', '/snap', '/srv', '/sys', '/tmp', '/usr', '/var']
    

    当然,您可以使用其他内容:

    glob.glob("*.docx")
    

    【讨论】:

    • 它明显更快吗?问题是,在B 目录中有10K 个文件,在A 文件夹中有20K 个文件 - 可以说/ 对于B 目录中的每个文件,我必须迭代以查找它是否在文件夹@ 中可用987654328@ 这需要大量计算...我的意思是已经在文件夹A 中迭代的文件将一次又一次地迭代,因为它是您可以理解的迭代次数以百万计...
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 2018-01-17
    • 2017-10-26
    • 2013-07-05
    • 2018-11-29
    • 2011-08-25
    • 2017-12-31
    • 2013-09-04
    相关资源
    最近更新 更多