嘿,我正在开发一个用 python 编写的非常高性能的文件管理/分析工具包。 我想创建一个函数,以树格式给我一个列表或类似的东西。 像这样的 question (java-related)
来自:
dir/file
dir/dir2/file2
dir/file3
dir3/file4
dir3/file5
注意:路径列表是未排序的
收件人:
dir/
file
dir2/
file2
file3
dir3/
file4
file5
[[dir, [file, [dir2, [file2]], file3]], [dir3, [file4, file5]]]
类似的东西。我一直在尝试一些想法,但没有一个能提供我想要的速度。
注意:我已经有了路径列表,所以不用担心。该函数采用路径列表并给出树列表。
提前致谢
最佳答案
既然您进一步澄清了问题,我猜您想要的是以下内容:
from collections import defaultdict
input_ = '''dir/file
dir/dir2/file2
dir/file3
dir2/alpha/beta/gamma/delta
dir2/alpha/beta/gamma/delta/
dir3/file4
dir3/file5'''
FILE_MARKER = '<files>'
def attach(branch, trunk):
'''
Insert a branch of directories on its trunk.
'''
parts = branch.split('/', 1)
if len(parts) == 1: # branch is a file
trunk[FILE_MARKER].append(parts[0])
else:
node, others = parts
if node not in trunk:
trunk[node] = defaultdict(dict, ((FILE_MARKER, []),))
attach(others, trunk[node])
def prettify(d, indent=0):
'''
Print the file tree structure with proper indentation.
'''
for key, value in d.iteritems():
if key == FILE_MARKER:
if value:
print ' ' * indent + str(value)
else:
print ' ' * indent + str(key)
if isinstance(value, dict):
prettify(value, indent+1)
else:
print ' ' * (indent+1) + str(value)
main_dict = defaultdict(dict, ((FILE_MARKER, []),))
for line in input_.split('\n'):
attach(line, main_dict)
prettify(main_dict)
输出:
dir3
['file4', 'file5']
dir2
alpha
beta
gamma
['delta']
delta
['']
dir
dir2
['file2']
['file', 'file3']
注意几点:
- 脚本大量使用defaultdicts , 基本上这允许跳过检查是否存在 key 及其初始化(如果不存在)
- 目录名称映射到字典键,我认为这对您来说可能是一个很好的功能,因为键是散列的,您可以通过这种方式比使用列表更快地检索信息。您可以访问
main_dict['dir2']['alpha']['beta']
... 形式的层次结构
- 注意
.../delta
和.../delta/
之间的区别。我认为这有助于您快速区分叶子是目录还是文件。
我希望这能回答您的问题。如果有任何不清楚的地方,请发表评论。
关于python - 从列表 os 文件路径构建树 (Python) - 性能依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8484943/