Самый быстрый способ поиска файлов в каталоге -Python - PullRequest
0 голосов
/ 30 августа 2018

У меня есть несколько каталогов, и у каждого есть файлы тысячами (10k +). Давайте выберем один каталог A с 10k файлами. У меня есть другой каталог (например, B), в котором хранятся файлы тысячами. Я пытаюсь найти все файлы, которые появляются в A и B, а также имеют конкретное расширение файла (скажем, .docx). Я могу легко применить вложенный цикл for, но так как файлы исчисляются многими тысячами, это занимает много времени. Есть ли в python более быстрый способ выполнить это? Какой-нибудь конкретный алгоритм, который вы хотите предложить, или какой-нибудь фрагмент кода?

Примечание - я знаю, как искать и получать файлы несколькими способами, я прошу предложить самый быстрый подход, файлы исчисляются миллионами, и повторение каждого из них снова и снова будет стоить ресурса.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Попробуйте модуль 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")
0 голосов
/ 30 августа 2018

Канонический метод сравнения каталогов в 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.

0 голосов
/ 30 августа 2018

Вы можете что-то вроде этого:

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

Это позволит выбрать файлы «.docx» в папке «A».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...