问题描述
为我提供了一个数组数组,其中我将基于给定的数组来模拟文件夹系统。例如:
Given = [[('folder1',),'file1'],[('folder2','file2',[('folder3','file3','file4']]]
输出应为:
folder1
└───file1
folder2
├───file2
└───folder3
├───file3
└───file4
文件夹被标识为每个数组的第一个,它们位于元组中,而文件只是数组中的字符串。
我有一个初始代码,但是没有输出正确的结果。生成├───
,└───
等时会出错,我们如何递归实现呢?
这是我的代码:
arrayOfArrays = [[('folder1','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','file1','file4','file5','file6','file7'],'file8','file9','file10','file11','file12'],'file13']
预期输出:
folder1
├───folder2
│ ├───file1
│ ├───file2
│ ├───file3
│ ├───file4
│ ├───file5
│ ├───file6
│ └───file7
├───file8
├───file9
├───folder3
│ ├───file10
│ ├───file11
│ └───file12
└───file13
测试案例3:
Given: [[('folder1',)],'file3']],[('folder4',[('folder5','file4']]]
预期:
folder1
folder2
└───folder3
├───file3
└───file2
folder4
└───folder5
└───file4
测试案例4:
Given: [('folder1','file5']]]
预期:
folder1
├───folder2
│ └───folder3
│ ├───file2
│ └───file3
└───folder3
└───folder4
├───file4
└───file5
[('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','g11']]
get_results(data)
解决方法
您可以稍微调整递归并使用ascii字符<!DOCTYPE html>
<html>
<head>
<title>Save form Data in a Text File using JavaScript</title>
<style>
* {
box-sizing: border-box;
}
div {
padding: 10px;
background-color: #f6f6f6;
overflow: hidden;
}
input[type=text],textarea,select {
font: 17px Calibri;
width: 100%;
padding: 12px;
border: 1px solid #ccc;
border-radius: 4px;
}
input[type=button]{
font: 17px Calibri;
width: auto;
float: right;
cursor: pointer;
padding: 7px;
}
</style>
</head>
<body>
<div>
<!--Add few elements to the form-->
<div>
<input type="text" id="txtName" placeholder="Enter your name" maxlength="10" required />
</div>
<div>
<input type="text" id="txtAge" placeholder="Enter your age" required />
</div>
<div>
<input type="text" id="txtEmail" placeholder="Enter your email address" required />
</div>
<div>
<select id="selCountry">
<option selected value="">-- Choose the country --</option>
<option value="India">India</option>
<option value="Japan">Japan</option>
<option value="USA">USA</option>
</select>
</div>
<div>
<textarea id="msg" name="msg" placeholder="Write some message ..." style="height:100px">
</textarea>
</div>
<div>
<input type="button" id="bt" value="Save data to file" onclick="saveFile()" />
</div>
</div>
</body>
<script>
let saveFile = () => {
// Get the data from each element on the form.
const name = document.getElementById('txtName');
const age = document.getElementById('txtAge');
const email = document.getElementById('txtEmail');
const country = document.getElementById('selCountry');
const msg = document.getElementById('msg');
// This variable stores all the data.
let data =
'\r Name: ' + name.value + ' \r\n ' +
'Age: ' +age.value + ' \r\n ' +
'Email: ' + email.value + ' \r\n ' +
'Country: ' + country.value + ' \r\n ' +
'Message: ' + msg.value;
// Convert the text to BLOB.
const textToBLOB = new Blob([data],{ type: 'text/plain' });
const sFileName = 'formData.txt'; // The file to save the data.
let newLink = document.createElement("a");
newLink.download = sFileName;
if (window.webkitURL != null) {
newLink.href = window.webkitURL.createObjectURL(textToBLOB);
}
else {
newLink.href = window.URL.createObjectURL(textToBLOB);
newLink.style.display = "none";
document.body.appendChild(newLink);
}
newLink.click();
}
</script>
</html>
,└
和│
:
─
输出(1):
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']],[('folder4','file4','file5']]]
get_results(data1)
data2 = [('folder1','file1','file3','file5','file6','file7'],'file8','file9','file10','file11','file12'],'file13']
get_results(data2)
data3 = [[('folder1',[('folder1','file1']],'file4']]]
get_results(data3)
输出(2):
f01
│───f02
│ │───f03
│ │ │───f04
│ │ │ │───f05
│ │ │ │ │───f06
│ │ │ │ │ │───f07
│ │ │ │ │ │ │───f08
│ │ │ │ │ │ │ │───f09
│ │ │ │ │ │ │ │ │───f10
│ │ │ │ │ │ │ │ │ │───g09
│ │ │ │ │ │ │ │ │ └───g10
│ │ │ │ │ │ │ │ └───g08
│ │ │ │ │ │ │ └───g07
│ │ │ │ │ │ └───g06
│ │ │ │ │ └───g05
│ │ │ │ └───g04
│ │ │ └───g03
│ │ └───g02
│ └───g01
└───f11
└───g11
输出(3):
folder1
│───folder2
│ └───folder3
│ │───file2
│ └───file3
└───folder3
└───folder4
│───file4
└───file5
输出(4):
folder1
│───folder2
│ │───file1
│ │───file2
│ │───file3
│ │───file4
│ │───file5
│ │───file6
│ └───file7
│───file8
│───file9
│───folder3
│ │───file10
│ │───file11
│ └───file12
└───file13