在这个脚本中,正确的Python方法是什么,以避免添加到列表中?

问题描述 投票:0回答:1

我对Python非常陌生,但在开始之前我已经阅读了w3schools教程。

最近的一次网络搜索让我找到了这个有用的脚本,它可以生成一个文件树的JSON表示。

#!/usr/bin/env python

import os
import errno

def path_hierarchy(path):
    hierarchy = {
        'type': 'folder',
        'name': os.path.basename(path),
        'path': path,
    }

    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

        if os.path.basename(path).endswith('doc') or os.path.basename(path).endswith('docx'):
            hierarchy['type'] = 'file'
        else:
+++         hierarchy = None


    return hierarchy

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

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

    print(json.dumps(path_hierarchy(directory), indent=4, sort_keys=True))

我有两个问题。

  1. 在由">>> "标记的位置,为什么在调用方法之前不使用FOR语句?path_hierarchy?

  2. 如何避免增加一个 等级制度 对象的文件既不是 "doc "也不是 "docx"? 我试着将 等级制度 反对 但这只是在JSON输出中返回一个 "null"。我想要的是完全没有条目,除非当前项目是一个文件夹或我的测试所允许的类型(在这种情况下是'doc'或'docx')。

python os.path
1个回答
1
投票

对于1,这是一个列表理解。它们用来从另一个列表建立一个列表。


对于2,真的,这里的问题是你不想要... ... None拟加入的 hierarchy['children']. 这可以有几种不同的方法,但要做到这一点,我只需要修改你的 >>> 行。

如果您有Python 3.8以上的版本,您可以使用一个叫做 赋值表达式(:=),并增加一个 if 检查到列表的理解。

hierarchy['children'] = [
    child := path_hierarchy(os.path.join(path, contents))
    for contents in os.listdir(path)
    if child  # Only add a child if the child is truthy (Not None)
]

在没有Python 3.8的情况下,你需要将该块转换为一个完整的。for 循环。

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

两者本质上是等同的。

不过这里的要点是,在把它添加到树上之前,只需要检查一下孩子是什么。

© www.soinside.com 2019 - 2024. All rights reserved.