Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免添加到此脚本列表中的正确Python方法是什么?_Python_Os.path - Fatal编程技术网

避免添加到此脚本列表中的正确Python方法是什么?

避免添加到此脚本列表中的正确Python方法是什么?,python,os.path,Python,Os.path,我对Python非常陌生,但在开始之前我已经阅读了w3schools教程 最近的一次web搜索让我找到了这个有用的脚本,它生成了一个文件树的JSON表示 #!/usr/bin/env python import os import errno def path_hierarchy(path): hierarchy = { 'type': 'folder', 'name': os.path.basename(path), 'path':

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

最近的一次web搜索让我找到了这个有用的脚本,它生成了一个文件树的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))
我有两个问题:

  • 在“>>>”标记的位置,为什么FOR语句不在对方法路径\层次结构的调用之前

  • 如何避免为既不是“doc”也不是“docx”的文件添加层次结构对象?我尝试在标记为“++”的行中将hierarchy对象设置为None,但这只是在JSON输出中返回了一个“null”。除非当前项目是我的测试所允许的文件夹或类型(在本例中为“doc”或“docx”),否则我不希望有任何条目


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


    对于2,实际上,这里的问题是您不希望将
    None
    s添加到
    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)
    
    两者本质上是等价的


    不过,这里的要点是在将孩子添加到树中之前检查孩子是什么。

    1。在Python教程中查找“列表理解”。@Barmar感谢您的帮助suggestion@Carcigenicate我的理解是''json.dumps''调用只在流程结束时进行一次,而不是每个条目进行一次。我错了吗?要搜索
    doc
    docx
    ,可以执行以下操作。如果您所说的
    2
    是指希望文件为空,只需返回一个空字符串(“”),而不是无。谢谢,非常清楚。现在我已经跟进了阅读列表理解的建议,我明白了。非常感谢。