Python 在控制台中实现文件夹目录
Python Implementation of Folder Directory in Console
我得到了一个数组数组,我将在其中模拟一个基于给定的文件夹系统。例如:
Given = [[('folder1',), 'file1'], [('folder2',), 'file2', [('folder3',), 'file3', 'file4']]]
输出应该是:
folder1
└───file1
folder2
├───file2
└───folder3
├───file3
└───file4
文件夹被标识为每个数组的第一个,它们在元组中,而文件只是数组中的字符串。
我有一个初始代码,但它没有输出正确的结果。生成├───
、└───
等都有错误,我们如何递归实现呢?
这是我的代码:
arrayOfArrays = [[('folder1',), 'file1'], [('folder2',), 'file2', [('folder3',), 'file3', 'file4']]]
def sChar(indent): # Creates the indentation and
if indent > 1: # Special Characters
print("│", end='')
while indent != 1:
print(" ", end='')
indent-=1
if indent == 1:
print("├───", end='')
def folderDirectory(directory, indent = 0):
for i in range(len(directory)):
if isinstance(directory[i], tuple):
sChar(indent)
print(directory[i][0])
indent+=1
elif isinstance(directory[i], list):
folderDirectory(directory[i], indent)
else:
sChar(indent)
print(directory[i])
folderDirectory(arrayOfArrays)
实际输出:
folder1
├───file1
folder2
├───file2
├───folder3
│ ├───file3
│ ├───file4
测试用例 2:
Given: [('folder1',), [('folder2',), 'file1', 'file2', 'file3', 'file4', 'file5', 'file6', 'file7'], 'file8', 'file9', [('folder3',), 'file10', 'file11', 'file12'], 'file13']
预期输出:
folder1
├───folder2
│ ├───file1
│ ├───file2
│ ├───file3
│ ├───file4
│ ├───file5
│ ├───file6
│ └───file7
├───file8
├───file9
├───folder3
│ ├───file10
│ ├───file11
│ └───file12
└───file13
测试用例 3:
Given: [[('folder1',)], [('folder2',), [('folder3',), 'file2', 'file3']], [('folder4',), [('folder5',), 'file4']]]
预计:
folder1
folder2
└───folder3
├───file3
└───file2
folder4
└───folder5
└───file4
测试用例 4:
Given: [('folder1',), [('folder2',), [('folder3',), 'file2', 'file3']], [('folder3',), [('folder4',), 'file4', 'file5']]]
预计:
folder1
├───folder2
│ └───folder3
│ ├───file2
│ └───file3
└───folder3
└───folder4
├───file4
└───file5
最坏情况(文件夹放在文件之前,深度为 10)
[('f01',), [('f02',), [('f03',), [('f04',), [('f05',), [('f06',), [('f07',), [('f08',), [('f09',), [('f10',), 'g09', 'g10'], 'g08'], 'g07'], 'g06'], 'g05'], 'g04'], 'g03'], 'g02'], 'g01'], [('f11',), 'g11']]
f01
├───f02
│ ├───f03
│ │ ├───f04
│ │ │ ├───f05
│ │ │ │ ├───f06
│ │ │ │ │ ├───f07
│ │ │ │ │ │ ├───f08
│ │ │ │ │ │ │ ├───f09
│ │ │ │ │ │ │ │ ├───f10
│ │ │ │ │ │ │ │ │ ├───g09
│ │ │ │ │ │ │ │ │ └───g10
│ │ │ │ │ │ │ │ └───g08
│ │ │ │ │ │ │ └───g07
│ │ │ │ │ │ └───g06
│ │ │ │ │ └───g05
│ │ │ │ └───g04
│ │ │ └───g03
│ │ └───g02
│ └───g01
└───f11
└───g11
您可以使用此代码来使用特殊字符
import sys
sys.stdout.reconfigure(encoding='utf-8')
最新代码(有效!)
import sys
sys.stdout.reconfigure(encoding='utf-8')
def lister(directory, ind=0, f = True):
yield f'{((" "*(ind-1)) if not f else "")}{"" if not ind else ""*(ind-1)+("" if f else "└")+"───"}'+directory[0][0]
for i, a in enumerate(directory[1:]):
if isinstance(a, str):
yield f'{((" "*(ind)) if not f else "") + ("└" if i == len(directory[1:]) - 1 else "├")+"───"}'+a
else:
for k in lister(a, ind=ind+1, f= i + 1 != len(directory[1:])):
yield ('│' if not k.startswith("─") else "├") +("" if k.startswith("───") else ' ' if not k.startswith(' ') else '')+k if i + 1 != len(directory[1:]) else k
def get_results(s):
for i in ([s] if isinstance(s[0], tuple) else s):
print('\n'.join(lister(i)))
data = [('f01',), [('f02',), [('f03',), [('f04',), [('f05',), [('f06',), [('f07',), [('f08',), [('f09',), [('f10',), 'g09', 'g10'], 'g08'], 'g07'], 'g06'], 'g05'], 'g04'], 'g03'], 'g02'], 'g01'], [('f11',), 'g11']]
get_results(data)
您可以稍微调整递归并使用 ascii 字符 └
、│
和 ─
:
import re
def get_struct(folder, ind=0, f = True):
yield f'{((" "*(ind-1)) if not f else "")}{"" if not ind else ""*(ind-1)+("" if f else "└")+"───"}'+folder[0][0]
for i, a in enumerate(folder[1:]):
if isinstance(a, str):
yield f'{((" "*(ind)) if not f else "") + ("└" if i == len(folder[1:]) - 1 else "│")+"───"}'+a
else:
for k in get_struct(a, ind=ind+1, f= i + 1 != len(folder[1:])):
yield '│'+("" if k.startswith("───") else ' ' if not k.startswith(' ') else '')+k if i + 1 != len(folder[1:]) else k
def get_results(s):
for i in ([s] if isinstance(s[0], tuple) else s):
print('\n'.join(get_struct(i)))
data = [('f01',), [('f02',), [('f03',), [('f04',), [('f05',), [('f06',), [('f07',), [('f08',), [('f09',), [('f10',), 'g09', 'g10'], 'g08'], 'g07'], 'g06'], 'g05'], 'g04'], 'g03'], 'g02'], 'g01'], [('f11',), 'g11']]
get_results(data)
data1 = [('folder1',), [('folder2',), [('folder3',), 'file2', 'file3']], [('folder3',), [('folder4',), 'file4', 'file5']]]
get_results(data1)
data2 = [('folder1',), [('folder2',), 'file1', 'file2', 'file3', 'file4', 'file5', 'file6', 'file7'], 'file8', 'file9', [('folder3',), 'file10', 'file11', 'file12'], 'file13']
get_results(data2)
data3 = [[('folder1',), 'file1', [('folder1',), 'file1']], [('folder2',), 'file2', [('folder3',), 'file3', 'file4']]]
get_results(data3)
输出(1):
f01
│───f02
│ │───f03
│ │ │───f04
│ │ │ │───f05
│ │ │ │ │───f06
│ │ │ │ │ │───f07
│ │ │ │ │ │ │───f08
│ │ │ │ │ │ │ │───f09
│ │ │ │ │ │ │ │ │───f10
│ │ │ │ │ │ │ │ │ │───g09
│ │ │ │ │ │ │ │ │ └───g10
│ │ │ │ │ │ │ │ └───g08
│ │ │ │ │ │ │ └───g07
│ │ │ │ │ │ └───g06
│ │ │ │ │ └───g05
│ │ │ │ └───g04
│ │ │ └───g03
│ │ └───g02
│ └───g01
└───f11
└───g11
输出(2):
folder1
│───folder2
│ └───folder3
│ │───file2
│ └───file3
└───folder3
└───folder4
│───file4
└───file5
输出(3):
folder1
│───folder2
│ │───file1
│ │───file2
│ │───file3
│ │───file4
│ │───file5
│ │───file6
│ └───file7
│───file8
│───file9
│───folder3
│ │───file10
│ │───file11
│ └───file12
└───file13
输出(4):
folder1
│───file1
└───folder1
└───file1
folder2
│───file2
└───folder3
│───file3
└───file4
我得到了一个数组数组,我将在其中模拟一个基于给定的文件夹系统。例如:
Given = [[('folder1',), 'file1'], [('folder2',), 'file2', [('folder3',), 'file3', 'file4']]]
输出应该是:
folder1
└───file1
folder2
├───file2
└───folder3
├───file3
└───file4
文件夹被标识为每个数组的第一个,它们在元组中,而文件只是数组中的字符串。
我有一个初始代码,但它没有输出正确的结果。生成├───
、└───
等都有错误,我们如何递归实现呢?
这是我的代码:
arrayOfArrays = [[('folder1',), 'file1'], [('folder2',), 'file2', [('folder3',), 'file3', 'file4']]]
def sChar(indent): # Creates the indentation and
if indent > 1: # Special Characters
print("│", end='')
while indent != 1:
print(" ", end='')
indent-=1
if indent == 1:
print("├───", end='')
def folderDirectory(directory, indent = 0):
for i in range(len(directory)):
if isinstance(directory[i], tuple):
sChar(indent)
print(directory[i][0])
indent+=1
elif isinstance(directory[i], list):
folderDirectory(directory[i], indent)
else:
sChar(indent)
print(directory[i])
folderDirectory(arrayOfArrays)
实际输出:
folder1
├───file1
folder2
├───file2
├───folder3
│ ├───file3
│ ├───file4
测试用例 2:
Given: [('folder1',), [('folder2',), 'file1', 'file2', 'file3', 'file4', 'file5', 'file6', 'file7'], 'file8', 'file9', [('folder3',), 'file10', 'file11', 'file12'], 'file13']
预期输出:
folder1
├───folder2
│ ├───file1
│ ├───file2
│ ├───file3
│ ├───file4
│ ├───file5
│ ├───file6
│ └───file7
├───file8
├───file9
├───folder3
│ ├───file10
│ ├───file11
│ └───file12
└───file13
测试用例 3:
Given: [[('folder1',)], [('folder2',), [('folder3',), 'file2', 'file3']], [('folder4',), [('folder5',), 'file4']]]
预计:
folder1
folder2
└───folder3
├───file3
└───file2
folder4
└───folder5
└───file4
测试用例 4:
Given: [('folder1',), [('folder2',), [('folder3',), 'file2', 'file3']], [('folder3',), [('folder4',), 'file4', 'file5']]]
预计:
folder1
├───folder2
│ └───folder3
│ ├───file2
│ └───file3
└───folder3
└───folder4
├───file4
└───file5
最坏情况(文件夹放在文件之前,深度为 10)
[('f01',), [('f02',), [('f03',), [('f04',), [('f05',), [('f06',), [('f07',), [('f08',), [('f09',), [('f10',), 'g09', 'g10'], 'g08'], 'g07'], 'g06'], 'g05'], 'g04'], 'g03'], 'g02'], 'g01'], [('f11',), 'g11']]
f01
├───f02
│ ├───f03
│ │ ├───f04
│ │ │ ├───f05
│ │ │ │ ├───f06
│ │ │ │ │ ├───f07
│ │ │ │ │ │ ├───f08
│ │ │ │ │ │ │ ├───f09
│ │ │ │ │ │ │ │ ├───f10
│ │ │ │ │ │ │ │ │ ├───g09
│ │ │ │ │ │ │ │ │ └───g10
│ │ │ │ │ │ │ │ └───g08
│ │ │ │ │ │ │ └───g07
│ │ │ │ │ │ └───g06
│ │ │ │ │ └───g05
│ │ │ │ └───g04
│ │ │ └───g03
│ │ └───g02
│ └───g01
└───f11
└───g11
您可以使用此代码来使用特殊字符
import sys
sys.stdout.reconfigure(encoding='utf-8')
最新代码(有效!)
import sys
sys.stdout.reconfigure(encoding='utf-8')
def lister(directory, ind=0, f = True):
yield f'{((" "*(ind-1)) if not f else "")}{"" if not ind else ""*(ind-1)+("" if f else "└")+"───"}'+directory[0][0]
for i, a in enumerate(directory[1:]):
if isinstance(a, str):
yield f'{((" "*(ind)) if not f else "") + ("└" if i == len(directory[1:]) - 1 else "├")+"───"}'+a
else:
for k in lister(a, ind=ind+1, f= i + 1 != len(directory[1:])):
yield ('│' if not k.startswith("─") else "├") +("" if k.startswith("───") else ' ' if not k.startswith(' ') else '')+k if i + 1 != len(directory[1:]) else k
def get_results(s):
for i in ([s] if isinstance(s[0], tuple) else s):
print('\n'.join(lister(i)))
data = [('f01',), [('f02',), [('f03',), [('f04',), [('f05',), [('f06',), [('f07',), [('f08',), [('f09',), [('f10',), 'g09', 'g10'], 'g08'], 'g07'], 'g06'], 'g05'], 'g04'], 'g03'], 'g02'], 'g01'], [('f11',), 'g11']]
get_results(data)
您可以稍微调整递归并使用 ascii 字符 └
、│
和 ─
:
import re
def get_struct(folder, ind=0, f = True):
yield f'{((" "*(ind-1)) if not f else "")}{"" if not ind else ""*(ind-1)+("" if f else "└")+"───"}'+folder[0][0]
for i, a in enumerate(folder[1:]):
if isinstance(a, str):
yield f'{((" "*(ind)) if not f else "") + ("└" if i == len(folder[1:]) - 1 else "│")+"───"}'+a
else:
for k in get_struct(a, ind=ind+1, f= i + 1 != len(folder[1:])):
yield '│'+("" if k.startswith("───") else ' ' if not k.startswith(' ') else '')+k if i + 1 != len(folder[1:]) else k
def get_results(s):
for i in ([s] if isinstance(s[0], tuple) else s):
print('\n'.join(get_struct(i)))
data = [('f01',), [('f02',), [('f03',), [('f04',), [('f05',), [('f06',), [('f07',), [('f08',), [('f09',), [('f10',), 'g09', 'g10'], 'g08'], 'g07'], 'g06'], 'g05'], 'g04'], 'g03'], 'g02'], 'g01'], [('f11',), 'g11']]
get_results(data)
data1 = [('folder1',), [('folder2',), [('folder3',), 'file2', 'file3']], [('folder3',), [('folder4',), 'file4', 'file5']]]
get_results(data1)
data2 = [('folder1',), [('folder2',), 'file1', 'file2', 'file3', 'file4', 'file5', 'file6', 'file7'], 'file8', 'file9', [('folder3',), 'file10', 'file11', 'file12'], 'file13']
get_results(data2)
data3 = [[('folder1',), 'file1', [('folder1',), 'file1']], [('folder2',), 'file2', [('folder3',), 'file3', 'file4']]]
get_results(data3)
输出(1):
f01
│───f02
│ │───f03
│ │ │───f04
│ │ │ │───f05
│ │ │ │ │───f06
│ │ │ │ │ │───f07
│ │ │ │ │ │ │───f08
│ │ │ │ │ │ │ │───f09
│ │ │ │ │ │ │ │ │───f10
│ │ │ │ │ │ │ │ │ │───g09
│ │ │ │ │ │ │ │ │ └───g10
│ │ │ │ │ │ │ │ └───g08
│ │ │ │ │ │ │ └───g07
│ │ │ │ │ │ └───g06
│ │ │ │ │ └───g05
│ │ │ │ └───g04
│ │ │ └───g03
│ │ └───g02
│ └───g01
└───f11
└───g11
输出(2):
folder1
│───folder2
│ └───folder3
│ │───file2
│ └───file3
└───folder3
└───folder4
│───file4
└───file5
输出(3):
folder1
│───folder2
│ │───file1
│ │───file2
│ │───file3
│ │───file4
│ │───file5
│ │───file6
│ └───file7
│───file8
│───file9
│───folder3
│ │───file10
│ │───file11
│ └───file12
└───file13
输出(4):
folder1
│───file1
└───folder1
└───file1
folder2
│───file2
└───folder3
│───file3
└───file4