我对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))
我有两个问题。
在由">>> "标记的位置,为什么在调用方法之前不使用FOR语句?path_hierarchy?
如何避免增加一个 等级制度 对象的文件既不是 "doc "也不是 "docx"? 我试着将 等级制度 反对 无 但这只是在JSON输出中返回一个 "null"。我想要的是完全没有条目,除非当前项目是一个文件夹或我的测试所允许的类型(在这种情况下是'doc'或'docx')。
对于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)
两者本质上是等同的。
不过这里的要点是,在把它添加到树上之前,只需要检查一下孩子是什么。