我得到了一个列表中的绝对目录路径列表,如下所示:-
[ ['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 '/' 以及使用 '/' 上的分割索引使用 var 来推断的。
老实说,这个问题引起了我的兴趣,所以这里的版本应该适用于您作为列表提供的任何目录结构,即使某些子文件夹未列出。
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
我使用您共享的完整文件进行了测试 - 似乎工作正常。早期版本不起作用的原因是我假设所有子目录都以“/”结尾,但有些子目录没有。一旦我用完整的集合进行测试,我就可以找出错误发生的位置。
关于python - 如何在python中存储绝对路径并将其显示为目录结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66355946/