控制台中文件夹目录的Python实现

问题描述

为我提供了一个数组数组,其中我将基于给定的数组来模拟文件夹系统。例如:

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

最坏情况(文件夹位于文件前,深度为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','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