json - 从递归目录树遍历构建 JSON 对象
问题描述
我正在遍历包含目录和文件的目录树。我知道我可以为此使用 os.walk ,但这只是我正在做的一个例子,最终结果必须是递归的。
获取数据的函数如下:
def walkfn(dirname):
for name in os.listdir(dirname):
path = os.path.join(dirname, name)
if os.path.isdir(path):
print(name)
walkfn(path)
elif os.path.isfile(path):
print(name)
假设我们有一个这样的目录结构:
testDir/
a/
1/
2/
testa2.txt
testa.txt
b/
3/
testb3.txt
4/
上面的代码将返回以下内容:
a
testa.txt
1
2
testa2.txt
c
d
b
4
3
testb3.txt
它正在做我在这一点上所期望的,并且值都是正确的,但我正在尝试将这些数据放入 JSON 对象中。我已经看到我可以将它们添加到嵌套字典中,然后将其转换为 JSON,但是我在使用这种递归方法将它们放入嵌套字典时失败了。
我期待的 JSON 是这样的:
{
"test": {
"b": {
"4": {},
"3": {
"testb3.txt": null
}
},
"a": {
"testa.txt": null,
"1": {},
"2": {
"testa2.txt": null
}
}
}
}
解决方案
您应该在递归函数中传递 json_data :
import os
from pprint import pprint
from typing import Dict
def walkfn(dirname: str, json_data: Dict=None):
if not json_data:
json_data = dict()
for name in os.listdir(dirname):
path = os.path.join(dirname, name)
if os.path.isdir(path):
json_data[name] = dict()
json_data[name] = walkfn(path, json_data=json_data[name])
elif os.path.isfile(path):
json_data.update({name: None})
return json_data
json_data = walkfn(dirname="your_dir_name")
pprint(json_data)
推荐阅读
- python - Pythno Selenium单击ui中的列表项
- python - Flask 在 WSGI 服务器中抛出 ascii 字符错误,但在调试本地服务器中没有?
- c++ - 如何在单个 Visual Studio Code 解决方案中编译多个独立的 C++ 程序
- flow-project - 运行 python 示例/simulate.py 时开始使用时出现错误
- reporting-services - 自定义添加的状态原因不会通过 FilteredView 显示在 SSRS 报告中
- ios - 在 iOS Swift 中使用 SvgKit 更改 SVG 颜色
- python - Django GraphQL 端点测试无法使用“变量”字典
- twilio - Twilio iOS sdk - 一对一视频通话
- jquery - 打开后如何使用 jQuery 关闭/隐藏此 div?
- networking - 如何使 TCP 套接字连接在具有不同 ISP 的 WAN 上工作?