python - 如何存储绝对路径并将它们显示为python中的目录结构?
问题描述
我得到了一个列表中的绝对目录路径列表:-
[ ['19.2.000/'],['19.2.000/data/'],
['19.2.000/data/datainstaller.zip'], ['19.2.000/data/rs_details'],
['19.2.000/rem/'],
['19.2.000/rem/remapp.zip'], ['19.2.000/rem/rs_details'],
['19.2.000/res/'], ['19.2.000/res/resapp.zip'], ['19.2.000/rms/'],
['19.2.000/rms/BdiEdge.zip'], ['19.2.001/'],
['19.2.001/dataconversion/'],
['19.2.001/dataconversion/dataconversioninstaller.zip'],
['19.2.001/dataconversion/rs_details'] ]
我想将目录结构显示为:-
|--19.2.000
| |--data
| | |--datainstaller.zip
| | |--rs_details
| |--rem
| | |--remapp.zip
| | |--rs_details
| |--res
| | |--resapp.zip
| |--rms
| | |--BdiEdge.zip
|--19.2.001
| |--dataconversion
| | |--dataconversioninstaller.zip
| | |--rs_details
我尝试使用嵌套的 for 循环(通过将每个级别存储在不同的列表中)来做到这一点,但是随着目录级别的增加,它变得多余且缓慢。任何其他方式来优化显示它?
解决方案
我首先对列表进行排序 - 然后它们至少按照您想要的顺序排列。这被推断为基于 num '/' 的缩进使用 vars 以及使用 '/' 上的拆分索引。
老实说,这个问题引起了我的兴趣,所以这里的版本应该与您作为列表提供的任何 dir 结构一起使用,即使某些子文件夹没有列出。
def make_fldr(arr):
print("-- Processing Pass 1 --")
processed = []
path_repr = ''
sub_dir = '| '
for path in arr:
dirs = path[0].split("/")
num_slash = path[0].count('/')
sep = '/'
for i in range(num_slash):
rep = sep.join(dirs[:i+1])
if [rep+'/'] not in arr:
arr.append([rep+'/'])
[processed.append(x) for x in arr if x not in processed]
print("-- Building structure: Pass 2 --")
processed.sort()
print("Processed List is sorted")
for path in processed:
num_slash = path[0].count('/')
if num_slash == 1:
piece = path[0].split("/")
if piece[1] == '':
path_repr += f'|--{piece[0]}\n'
else:
path_repr += f'{sub_dir}|--{piece[1]}\n'
else:
if path[0].split("/")[-1] == '':
path_repr += f'{sub_dir * (num_slash-1)}|--{path[0].split("/")[-2]}\n'
else:
path_repr += f'{sub_dir * num_slash}|--{path[0].split("/")[-1]}\n'
return path_repr
structure = make_fldr(data)
print(structure)
给定一个扩展集
data = [
['19.2.000/'],
['19.2.000/resa/'],
['19.2.000/resa/resa19application.zip'],
['19.2.000/rms/'],
['19.2.000/rms/BdiEdgeAppJobAdminPak19.1.000ForRms19.1.000_eng_ga.zip'],
['19.2.001/'],
['19.2/'],
['19.2/rpm/'],
['19.2/rpm/release_details'],
['19.2/rpm/rpm19application.zip'],
['RESA/'],
['RESA/folder1/'],
['RESA/folder1/release_details'],
['RESA/folder1/resainstaller.zip'],
['RESA/release_details'],
['RESA/resainstaller.zip'],
['RMS/'],
['RMS/release_details'],
['RMS/rmsinstaller.zip'],
['RPM/'],
['RPM/release_details'],
['RPM/rpminstaller.zip']
]
上面的函数产生
Processed List is sorted
|--19.2.000
| |--resa
| | |--resa19application.zip
| |--rms
| | |--BdiEdgeAppJobAdminPak19.1.000ForRms19.1.000_eng_ga.zip
|--19.2.001
|--19.2
| |--rpm
| | |--release_details
| | |--rpm19application.zip
|--RESA
| |--folder1
| | |--release_details
| | |--resainstaller.zip
| |--release_details
| |--resainstaller.zip
|--RMS
| |--release_details
| |--rmsinstaller.zip
|--RPM
| |--release_details
| |--rpminstaller.zip
我用你分享的完整文件进行了测试——它似乎工作正常。早期版本不起作用的原因是我假设所有子目录都以'/'结尾,但有些没有。一旦我用完整的集合进行测试,我就可以找出错误发生的位置。
推荐阅读
- php - 从数据库中的一个表中统计该特定 ID 号下的数据
- android - 2019 年 8 月 NDK 64 位要求 Intel 二进制文件
- java - 在 chrome 中进行身份验证后无法与网站元素交互
- json - 发送带有请求的 recaptcha 令牌的错误 401
- git - Git 分支永远领先
- python - 在分类问题中对类进行过采样
- javascript - Javascript:搜索子字符串模式并返回找到的字符串
- c# - Dapper - “必须声明标量变量@VersionId”
- c# - Unity C# - 比较两个变量时遇到问题
- c# - 如何在没有输入文本的情况下捕获条码扫描值