Поиск нескольких файлов с разными расширениями (Python3) - PullRequest
0 голосов
/ 25 марта 2020

Я пытался использовать Python 3 для поиска в файловой системе root различных расширений файлов, таких как .mp3, .mp4, .png, .jpg и других типов носителей.

I удалось сделать это с помощью bash:

find / -name '*.jpg' -o -name '*.mp4' -o -name '*.flv' -o -name '*.avi' -o -name '*.wmv' -o -name '*.mov' -o -name '*.png' -o -name '*.jpg' -o -name '*.tif' -o -name '*.gif' -o -name '*.mp3' -o -name '*.wmv' -o -name '*.wma' -o -name '*.aif' -o -name '*.jar'

И я смог использовать этот код с использованием subprocess.call(command.split(command))

Но я бы предпочел не использовать bash команды с моим python кодом, если я могу помочь.

Я успешно использовал этот код

with open('logTest.txt', 'a+') as f:
    os.chdir('/')
    for file in glob.iglob('**/*.mp3', recursive=True):
        f.write(file + '\n')
        print(file)

Это откроет файл журнала и успешно найдет все файлы .mp3, начиная с файловой системы root. Но, как вы, вероятно, можете понять, он не находит никаких других типов медиа файлов. Я хотел бы сделать это в python3. Я посмотрел вокруг на переполнение стека и видел другие примеры, но они, кажется, никогда не делают то, что я хочу от них. Они либо не запускаются, либо ничего не распечатывают, либо работают, но только для одного расширения файла за раз.

Любая помощь с этой проблемой очень ценится.

(извините, если этот вопрос часто повторяется)

1 Ответ

0 голосов
/ 25 марта 2020

К сожалению, с glob вы не можете сопоставить несколько внутренних номеров за один проход. Вы должны объединить результаты из отдельных вызовов.

Как и рекомендуется Поши , попробуйте использовать os.walk().

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

import os

extensions = ('.jpg', '.mp4', '.flv', '.avi', '.wmv', '.mov', '.png', '.tif', 
              '.gif', '.mp3', '.wma', '.aif', '.jar')

with open('logTest.txt', 'a+') as f:
    for root, dirs, files in os.walk('/'):
        for filename in files:
            if any(filename.endswith(extension) for extension in extensions):
                filepath = os.path.join(root, filename)
                f.write(filepath + '\n')
                print(filepath)
...