避免添加到此脚本中的列表的正确 Python 方法是什么?
What is the correct Python approach to avoid adding to the list in this script?
我是 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))
我有 2 个问题:
在“>>>”标记的位置,为什么FOR语句不在调用方法path_hierarchy之前?
如何避免为既不是 "doc" 也不是 "docx" 的文件添加 hierarchy 对象?我尝试在标记为“+++”的行将 hierarchy 对象设置为 None 但这只是返回了 "null" 在 JSON 输出中。我想要的是根本没有条目,除非当前项目是我的测试允许的文件夹或类型(在这种情况下 'doc' 或 'docx')
对于 1,这是一个列表理解。它们用于从另一个列表构建一个列表。
对于 2,真的,这里的问题是您不希望将 None
添加到 hierarchy['children']
。这可以通过几种不同的方式完成,但为此,我只需修改您的 >>>
行。
如果您有 Python 3.8+,您可以使用 assignment expression (:=
),并向列表理解添加 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)
两者本质上是等价的。
这里的要点是在将 child 添加到树之前检查它是什么。
我是 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))
我有 2 个问题:
在“>>>”标记的位置,为什么FOR语句不在调用方法path_hierarchy之前?
如何避免为既不是 "doc" 也不是 "docx" 的文件添加 hierarchy 对象?我尝试在标记为“+++”的行将 hierarchy 对象设置为 None 但这只是返回了 "null" 在 JSON 输出中。我想要的是根本没有条目,除非当前项目是我的测试允许的文件夹或类型(在这种情况下 'doc' 或 'docx')
对于 1,这是一个列表理解。它们用于从另一个列表构建一个列表。
对于 2,真的,这里的问题是您不希望将 None
添加到 hierarchy['children']
。这可以通过几种不同的方式完成,但为此,我只需修改您的 >>>
行。
如果您有 Python 3.8+,您可以使用 assignment expression (:=
),并向列表理解添加 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)
两者本质上是等价的。
这里的要点是在将 child 添加到树之前检查它是什么。