Py学习  »  Python

python文件路径&仅针对特定扩展名进行筛选

Jae Nulton • 5 年前 • 1605 次点击  

下面是我用来生成json文件的脚本。我想知道的是,是否有一种简单的方法来使用这个脚本(因为它正在工作),但只有在文件扩展名为.wav时才能创建项?

如果没有,我可以将脚本移动到父目录,但是我需要如何修改脚本来扫描子目录,而不是脚本所在的目录?这是带有def path_u hierarchy(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))
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47251
 
1605 次点击  
文章 [ 3 ]  |  最新文章 5 年前
MichaelD
Reply   •   1 楼
MichaelD    6 年前

我会用 pathlib 模块,如果您使用的是Python3。它使得路径和文件的使用更加简单。(我做了一些自由,只是想说明为什么路径比 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
daniel mcgregor
Reply   •   2 楼
daniel mcgregor    6 年前

我不理解您的第二个问题,但要回答您的第一个问题,我发现检查文件类型的最简单方法是:

try:
        hierarchy['children'] = [
            path_hierarchy(os.path.join(path, contents))
            for contents in os.listdir(path)
                if file.endswith('.wav'):
                    # do something
        ]
NCoop
Reply   •   3 楼
NCoop    6 年前

我不完全理解你提出的第二个选择,但要回答第一个选择,你可以检查每一个 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
        ]
...

希望这有帮助!