python3如何对类中的每种类型的文件使用os.scandir

时间:2018-03-13 15:59:15

标签: python-3.x

尝试在python中改进我的OOP,

我想添加许多有用的功能, 作为一个开始,我尝试列出

mp3,mp4,图片,并显示不支持的扩展程序列表,然后返回显示并在我的主项目中使用

import os

class Functions(object):

    # templates/video/vids
    def scan_dir(self, this_dir="/home/X/Videos", videos=[], images=[], audio=[], folder=[], denied=[]):
        # EXTENSIONS #
        ##############
        self.videos = videos
        self.images = images
        self.audio  = audio
        self.folder = folder
        self.denied = denied


        for files in os.scandir(this_dir):
            # for files in this_dir:
            #
                ## VIDEOS
                ###########
                if files[:3] == "mp4" or files[:3] == "MP4" or files[:3] == "FLV" or files[:3] == "flv" :
                    videos.append(files)

                ## IMAGES
                ###########
                elif files[:3] == "PNG" or files[:3] == "png" or files[:3] == "JPG" or files[:3] == "jpg" :
                    images.append(files)

                ## AUDIO
                ###########
                elif files[:3] == "mp3" or files[:3] == "MP3" or files[:3] == "wav" or files[:3] == "WAV" :
                        audio.append(files)

                ## FOLDER
                ###########
                elif files.name.startswith('.'):
                        folder.append(files)

                ## DENIED
                ###########
                else:
                    denied.append(files)

                VIDSTR = ' '.join(videos)
                IMGSTR = ' '.join(images)
                AUDSTR = ' '.join(audio)
                FOLSTR = ' '.join(folder)
                DENSTR = ' '.join(denied)

                sorted_files = [VIDSTR, IMGSTR, AUDSTR, FOLSTR, DENSTR]


        return sorted_files

1 个答案:

答案 0 :(得分:0)

您可以进行一些更改。

您可以使用工厂功能根据文件的扩展名或其他模式对文件进行分类。还可以利用defaultdict并根据每个文件的分类附加到它。

从您的代码中,不清楚您是否确实想要将文件名作为str返回,该文件名为os.DirEntry.name,或者只是对象os.DirEntry,这就是您可以在这里传递给classify()

from collections import defaultdict
import os

def classify(file: os.DirEntry) -> int:
    file = file.name.lower()
    if file.endswith(('.mp4', '.flv')):
        return 0
    elif file.endswith(('.png', '.jpg')):
        return 1
    elif file.endswith(('.mp3', '.wav')):
        return 2
    elif file.startswith('.'):
        return 3
    else:
        return 4

class Functions(object):
    def __init__(self, this_dir="/home/X/Videos"):
        self.this_dir = this_dir
        self.allfiles = defaultdict(list)

    def scan_dir(self) -> defaultdict:
        for file in os.scandir(self.this_dir):
            self.allfiles[classify(file)].append(file)
        return self.allfiles

示例:

>>> f = Functions(this_dir='/Users/brad/Downloads/media/')
>>> f.scan_dir()
defaultdict(list,
            {0: [<DirEntry 'movie2.mp4'>, <DirEntry 'movie.mp4'>],
             1: [<DirEntry 'pic.png'>],
             2: [<DirEntry 'music.wav'>, <DirEntry 'music2.mp3'>],
             3: [<DirEntry '.hidden'>, <DirEntry '.DS_Store'>]})