Сценарий, который я использую для создания файла JSON, приведен ниже. Я хотел бы знать, есть ли простой способ использовать этот сценарий (поскольку он работает), но создавать элементы только в том случае, если файлы имеют расширение .WAV?

Если нет, я могу переместить скрипт в родительский каталог, но тогда как мне нужно изменить скрипт для сканирования подкаталога вместо того же каталога, в котором находится скрипт? Будет ли это строка с def path_ иерархия (путь)?

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

import os
import errno

def path_hierarchy(path):
    hierarchy = {
        'artist': os.path.basename(path),
        'album': 'Node 42177',
        'url': os.path.join("../audio/", os.path.basename(path)),
        'cover_art_url': '../album-art/Radio.jpg',
    }

    try:
        hierarchy['children'] = [
            path_hierarchy(os.path.join(path, contents))
            for contents in os.listdir(path)
        ]
    except OSError as e:
        if e.errno != errno.ENOTDIR:
            raise
        #hierarchy['type'] = 'file'

    return hierarchy

if __name__ == '__main__':
    import json
    import sys

    try:
        directory = sys.argv[1]
    except IndexError:
        directory = "."

    print(json.dumps(path_hierarchy(directory), indent=2, sort_keys=True))
0
Jae Nulton 28 Июн 2019 в 00:46

3 ответа

Лучший ответ

Я не совсем понимаю второй предложенный вами вариант, но чтобы ответить на первый вариант, вы можете проверить каждый contents, сгенерированный в вашем for contents in os.listdir(path), на предмет понимания цикла, что он содержит расширение .WAV.

Придерживаясь ваших настроек, это будет выглядеть следующим образом:

...
try:
        hierarchy['children'] = [
            path_hierarchy(os.path.join(path, contents))
            for contents in os.listdir(path)
            if '.WAV' in contents
        ]
...

Надеюсь это поможет!

1
NCoop 27 Июн 2019 в 22:02

Я не понимаю ваш второй вопрос, но чтобы ответить на ваш первый вопрос, я нашел самый простой способ проверить тип файла:

try:
        hierarchy['children'] = [
            path_hierarchy(os.path.join(path, contents))
            for contents in os.listdir(path)
                if file.endswith('.wav'):
                    # do something
        ]
1
daniel mcgregor 27 Июн 2019 в 22:04

Я бы использовал pathlib, если вы используете Python 3. Он делает использование пути и файлы намного проще. (Я взял несколько свобод, чтобы показать, почему Path намного лучше, чем альтернативы os.

from pathlib import Path

cwd_ = Path.cwd()
parent_path = cwd_.parent

def path_hierarchy(path):
    p = Path(path)
    hierarchy = {
        'artist': p.stem,
        'album': 'Node 42177',
        'url': parent_path/"audio"/p.stem,
        'cover_art_url': parent_path/'album-art/Radio.jpg',
    }

    try:
        hierarchy['children'] = [
            path_hierarchy(contents)
            for contents in p.glob('*.mp3') ### YOUR EXTENSION HERE
        ]
    except OSError as e:
        if e.errno != errno.ENOTDIR:
            raise
        #hierarchy['type'] = 'file'

    return hierarchy
1
MichaelD 27 Июн 2019 в 22:14