Python 类 中的 Glob 以访问文件中的元素

Python Glob in Classes to access elements from file

您好,我在使用 glob 访问多个子目录中的文件列表时遇到问题。

这是我的代码:

class Folder:
    """Attempt to model typical folder."""

    def __init__(self, path):
        self.path = path

    def get_folder(self):
        files = glob.glob(os.path.join(self.path, "*"))
        dir_list = []

        for f in files:
            if os.path.isdir(f):
                dir_list = dir_list + [
                    os.path.join(self.path, elt) for elt in os.listdir(f)
                ]
        return dir_list

    def get_file(self):
        dir_list = self.get_folder()
        sf_list = []

        for line in dir_list:
            sep = os.path.sep
            subfiles = glob.glob(sep.join([line, "*"]))
            sf_list.append(subfiles)

        return sf_list


代码结构如下:

    datasets 
        Actor1,
            emotion1
                one.wav
                two.wav
            emotion2
                one.wav
                two.wav
        Actor2
            emotion1
                one.wav
                two.wav
            emotion2
                one.wav
                two.wav

我的 Folder(datasets).get_folder() 的输出如下。

['...\datasets\Actor1\emotion1',
 '...\datasets\Actor1\emotion2',
 '...\datasets\Actor2\emotion2',
 '...\datasets\Actor2\emotion2',]

但是当我尝试访问子文件夹中的文件并将其保存到变量中时,调用 Folder(datasets).get_file() 而不是返回所有子文件,

['...\datasets\Actor1\emotion1\one.wav',
 '...\datasets\Actor1\emotion1'\two.wav',
 '...\datasets\Actor2\emotion2\one.wav',
 '...\datasets\Actor2\emotion2\two.wav',]

它输出一个包含多个空值的列表: Out[3]: [ [], [], [], []]

你能帮忙吗?

我还没有测试过这个,但这对你来说可能是一个好的开始。

import pathlib

class Folder(pathlib.Path):
    def files(self):
        return [f for f in self.iterdir() if f.is_file()]

    def folders(self):
        return [f for f in self.iterdir() if f.is_dir()]

https://docs.python.org/3/library/pathlib.html#pathlib.Path.iterdir

因为我一直在寻找 wav 文件,所以我找到了我的问题的解决方案,该问题是针对我正在寻找的特定文件进行硬编码的。

不是最完美的答案,但很合适。

def get_file_list(self):
    dir_list = self.get_folder_list()
    for path in sorted(self.path.rglob('*.wav')):
        print(path)

感谢大家!