Есть ли способ автоматически генерировать пустой массив для каждой итерации цикла for? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь создать отдельный массив для каждого прохода цикла for, чтобы сохранить значения 'signal', которые генерируются функцией wavefile.read.

Некоторые сведения о том, как работает код / ​​как я хотел бы, чтобы он работал:

У меня есть следующий путь к файлу:

Root directory 
    Labeled directory
        Irrelevant multiple directories
            Multiple .wav files stored in these subdirectories

    Labeled directory
        Irrelevant multiple directories
            Multiple .wav files stored in these subdirectories

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

Это то, что я пытался:

for label in df.index:

    for path, directories, files in os.walk('voxceleb1/wav_dev_files/' + label):
        for file in files:
            if file.endswith('.wav'):
                count = count + 1
                rate,signal = wavfile.read(os.path.join(path, file))

print(count)

What dataframe df looks like

Выше приведен снимок кадра данных df

В конечном счете, причина этих массивов заключается в том, что я хотел бы рассчитать среднюю продолжительность времени файлов wav, содержащихся в каждом помеченномподкаталога и добавьте его как вектор столбцов в фрейм данных.

Обратите внимание, что индекс фрейма данных соответствует именам каталогов. Я ценю любую помощь!

1 Ответ

0 голосов
/ 18 октября 2019

Выложенный вами фрагмент кода может быть немного упрощен и модернизирован. Вот что я придумал:

У меня следующая структура каталогов:

Вместо этого я использую текстовые файлыwav-файлов в моем примере, потому что у меня нет под рукой wav-файлов. В моих root у меня есть A и B (это должны быть ваши "помеченные каталоги"). A имеет два текстовых файла. B имеет один непосредственный текстовый файл и одну подпапку с другим текстовым файлом внутри (это предназначено для имитации ваших "неактуальных нескольких каталогов").

Код:

def main():

    from pathlib import Path

    root_path = Path("./root/")
    labeled_directories = [path for path in root_path.iterdir() if path.is_dir()]

    txt_path_lists = []

    # Generate lists of txt paths
    for labeled_directory in labeled_directories:
        txt_path_list = list(labeled_directory.glob("**/*.txt"))
        txt_path_lists.append(txt_path_list)

    # Print the lists of txt paths
    for txt_path_list in txt_path_lists:
        print(txt_path_list)

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

Выходные данные:

[WindowsPath('root/A/a_one.txt'), WindowsPath('root/A/a_two.txt')]
[WindowsPath('root/B/b_one.txt'), WindowsPath('root/B/asdasdasd/b_two.txt')]

Как видите, мы сгенерировали два списка путей к текстовым файлам, по одному для каждого помеченного каталога. Шаблон glob, который я использовал (**/*.txt), обрабатывает несколько вложенных каталогов и рекурсивно находит все текстовые файлы. Все, что вам нужно сделать, это изменить расширение в шаблоне glob, чтобы он вместо этого находил файлы .wav.

...