скрипт Python для поиска каталогов для определенного типа файла - PullRequest
0 голосов
/ 03 ноября 2018

Привет, ребята, в приведенном ниже сценарии, я попытался сначала перечислить все файлы и каталоги в моем домашнем каталоге, а затем проверить, есть ли какой-либо файл с определенным расширением, например, (.py, .mkv).

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

Вот мой код:

import os

class Sorter(object):
    path = os.environ['HOME']
    all_dirs = list()
    all_items = list()
    address = None
    movies = list()


    def __init__(self):
        pass

    def list_directories(self):
        dirs = os.listdir(self.path)
        for d in dirs:
            if os.path.isdir(os.path.join(self.path,d)):
                self.all_dirs.append(d)

            elif os.path.isfile(os.path.join(self.path,d)):
                self.all_items.append(d)

    def find_movies(self):

        for item in self.all_items:
            if os.path.splitext(os.path.join(self.path,item))[1] in ['.mp3','.mkv']:
                self.movies.append(item)
        for directory in self.all_dirs:
            try:
                os.chdir(os.path.join(self.path,directory))
                for i in directory:
                    if os.path.splitext(os.path.join(self.path,item))[1] in ['.mp3','.mkv']:
                        self.movies.append(item)
                os.chdir(self.path)
            except:
                pass

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Вы можете использовать модуль стандартной библиотеки pathlib и glob для поиска файлов по расширению.

Глобальный диалект менее мощный, чем в bash, но вы можете использовать ** для рекурсивного сопоставления подкаталогов. Вы не можете использовать расширение скобки в стиле bash *.{mp3,mkv}. Вместо этого вы можете связать результаты нескольких глобальных поисков.

from pathlib import Path

def find_files(root, extensions):
    for ext in extensions:
        yield from Path(root).glob(f'**/*.{ext}')

for movie in find_files(Path.home() / 'Videos', ['mp4', 'mkv', 'avi']):
    print(movie)

Обратите внимание, что объекты Path перегружают оператор /, поэтому Path.home() / 'Videos' создаст объект пути, представляющий /home/username/Videos/

0 голосов
/ 04 ноября 2018

Это кажется слишком сложным. Посмотрите этот подход с os.walk и списком-фильтрами для фильтрации файлов:

import os

Создание файлов:

dirs = [r"./subdir",r"./subdir/tata",r"subdir/tarumpa",r"./dir2b"]
files = ["k.mp4","some.txt","cool.mp3"]

def touch(p,fn):
    with open(os.path.join(p,fn),"w") as f:
        f.write(" ")

for d in dirs:
    os.mkdir(d)
    for f in files:
        touch(d,f)

Поиск файлов:

movie = []        
music = []        

# os.walk recurses into subdirectories, it returns a generator for each directory
# including the directory its in as root, all subdirs in dirs and all files in 
# files: then it steps into each of the dirs and does the same ...
for root,dirs,files in os.walk("./"):
    # root is the dir we are currently in, f the filename that ends on ...
    movie.extend( (os.path.join(root,f) for f in files if f.endswith(".mp4")) )
    music.extend( (os.path.join(root,f) for f in files if f.endswith(".mp3")) )

print(movie)
print(music)

Выход:

# movies
['./subdir/k.mp4', './subdir/tarumpa/k.mp4', './subdir/tata/k.mp4', './dir2b/k.mp4']

# music
['./subdir/cool.mp3', './subdir/tarumpa/cool.mp3', 
 './subdir/tata/cool.mp3', './dir2b/cool.mp3']
...