因此,在解决这个问题时,我遇到了一个心理障碍,我所考虑的其他问题都没有真正抓住我的特定用例。有一个问题很接近,但我不太清楚如何具体地定制它。基本上,我有一个脚本,它使用os.walk()
并重命名目标目录中的所有文件(以及任何子目录),具体的问题是,我试图以JSON格式记录操作的结果,输出如下:
{
"timestamp": "2022-12-26 09:40:55.874718",
"files_inspected": 512,
"files_renamed": 256,
"replacement_rules": {
"%20": "_",
" ": "_"
},
"target_path": "/home/example-user/example-folder",
"data": [
{
"directory": "/home/example-user/example-folder",
"files": [
{
"original_name": "file 1.txt",
"new_name": "file_1.txt"
},
{
"original_name": "file 2.txt",
"new_name": "file_2.txt"
},
{
"original_name": "file 3.txt",
"new_name": "file_3.txt"
}
],
"children": [
{
"directory": "/home/example-user/example-folder/sub-folder",
"files": [
{
"original_name": "file 1.txt",
"new_name": "file_1.txt"
},
{
"original_name": "file 2.txt",
"new_name": "file_2.txt"
},
{
"original_name": "file 3.txt",
"new_name": "file_3.txt"
}
]
}
]
}
]
}
3元组中的第一项(dirpath
)作为目标目录开始,并且在同一循环中,3元组中的第二项(dirnames
)是该dirpath
中的目录列表(如果有的话)。然而,我认为让我搞砸的是,在第二个循环上,dirpath
成为前一循环中dirnames
中的第一项(如果有的话)。我在计算将这个3元组循环数据转换到上面的嵌套层次结构的逻辑时遇到了麻烦。理想情况下,如果不具有子目录(children
)的目录对象也根本不具有children
密钥,则是很好的,但是将其设置为空列表也是很好的。
我非常感谢您对如何从os.walk()
提供的内容中实现所需日志结构的任何建议或见解。同时欢迎您对改进JSON对象结构提出任何建议。谢谢!
https://github.com/dblinkhorn/file_renamer
2条答案
按热度按时间bzzcjhmw1#
您的方法中的一个问题是,您想要一个通过递归最自然地获得的层次结构结果,而
os.walk
使层次结构扁平化。出于这个原因,我建议使用
os.scandir
来代替,它也恰好是与目录树交互的性能最好的工具之一。示例
让我们构建一个可重现的示例:
x一个一个一个一个x一个一个二个x
现在,使用上面的
rename()
函数:fruv7luv2#
我不确定我是否理解正确,但是要从
os.walk
获得一个简单的嵌套结构,可以尝试以下方法:会产生一个输出
这个有用吗?
注意:这是一个最小的例子,试图解决请求的主要部分。你需要围绕它构建你的结构的其余部分。
注2:如果你在某处有一个名为
files
的子文件夹,关键字files
可能会引起冲突。请明智地选择。)