----
要直接看源码的同学:
目录
----
前几天看见cmd里的一行命令:
tree d:
然后
(节选)
│ │ ├─Windows.System.Profile.ProfileRetailInfoContract
│ │ │ └─1.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.System.Profile.ProfileSharedModeContract
│ │ │ └─2.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.System.Profile.SystemManufacturers.SystemManufacturersContract
│ │ │ └─3.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.System.SystemManagementContract
│ │ │ └─7.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.System.UserProfile.UserProfileContract
│ │ │ └─2.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.System.UserProfile.UserProfileLockScreenContract
│ │ │ └─1.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.ApplicationSettings.ApplicationsSettingsContract
│ │ │ └─1.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.Core.AnimationMetrics.AnimationMetricsContract
│ │ │ └─1.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.Core.CoreWindowDialogsContract
│ │ │ └─1.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.Core.Preview.Communications.PreviewCommunicationsContract
│ │ │ └─1.0.0.0
│ │ ├─Windows.UI.Shell.SecurityAppManagerContract
│ │ │ └─1.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.UIAutomation.UIAutomationContract
│ │ │ └─2.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.ViewManagement.ViewManagementViewScalingContract
│ │ │ └─1.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.WebUI.Core.WebUICommandBarContract
│ │ │ └─1.0.0.0
│ │ │ └─en
│ │ ├─Windows.UI.Xaml.Core.Direct.XamlDirectContract
│ │ │ └─5.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ ├─Windows.UI.Xaml.Hosting.HostingContract
│ │ │ └─5.0.0.0
│ │ │ ├─de
│ │ │ ├─en
│ │ │ ├─es
│ │ │ ├─fr
│ │ │ ├─it
│ │ │ ├─jp
│ │ │ ├─ko
│ │ │ ├─ru
│ │ │ ├─zh-hans
│ │ │ └─zh-hant
│ │ └─Windows.Web.Http.Diagnostics.HttpDiagnosticsContract
│ │ └─2.0.0.0
│ │ ├─de
│ │ ├─en
│ │ ├─es
│ │ ├─fr
│ │ ├─it
│ │ ├─jp
│ │ ├─ko
│ │ ├─ru
│ │ ├─zh-hans
│ │ └─zh-hant
│ ├─Remote
│ │ ├─ARM
│ │ ├─x64
│ │ └─x86
│ ├─Shortcuts
│ ├─Source
│ │ ├─10.0.18362.0
│ │ │ └─ucrt
│ │ │ ├─conio
│ │ │ ├─convert
│ │ │ ├─dll
│ │ │ ├─env
│ │ │ ├─exec
│ │ │ ├─filesystem
│ │ │ ├─heap
│ │ │ ├─inc
│ │ │ │ └─i386
│ │ │ ├─initializers
│ │ │ │ └─i386
│ │ │ ├─internal
│ │ │ ├─locale
│ │ │ ├─lowio
│ │ │ ├─mbstring
│ │ │ ├─misc
│ │ │ ├─startup
│ │ │ ├─stdio
│ │ │ ├─stdlib
│ │ │ ├─string
│ │ │ │ ├─amd64
│ │ │ │ └─i386
│ │ │ └─time
│ │ └─10.0.22000.0
│ │ └─ucrt
│ │ ├─conio
│ │ ├─convert
│ │ ├─dll
│ │ ├─env
│ │ ├─exec
│ │ ├─filesystem
│ │ ├─heap
│ │ ├─inc
│ │ │ └─i386
│ │ ├─initializers
│ │ │ └─i386
│ │ ├─internal
│ │ ├─locale
│ │ ├─lowio
│ │ ├─mbstring
│ │ ├─misc
│ │ ├─startup
│ │ ├─stdio
│ │ ├─stdlib
│ │ ├─string
│ │ │ ├─amd64
│ │ │ ├─arm
│ │ │ ├─arm64
│ │ │ └─i386
│ │ └─time
│ ├─Testing
│ │ └─Runtimes
│ │ └─TAEF
│ │ ├─MinTe
│ │ │ ├─NetFx4.5
│ │ │ ├─netstandard1.1
│ │ │ └─netstandard2.0
│ │ ├─NetFx4.5
│ │ ├─netstandard1.1
│ │ ├─netstandard2.0
│ │ └─x64
│ │ ├─MinTe
│ │ │ ├─NetFx4.5
│ │ │ ├─netstandard1.1
│ │ │ └─netstandard2.0
│ │ ├─NetFx4.5
│ │ ├─netstandard1.1
│ │ └─netstandard2.0
│ └─UnionMetadata
│ ├─10.0.18362.0
│ │ └─Facade
│ └─10.0.22000.0
│ └─Facade
└─新建文件夹
于是我就想用Python做一个。
源码
def tree(path):
r"""
列出所有的目录下子目录及文件
例:
文件夹plogin,有子文件夹a,a2;子文件夹a有子文件夹b.
plogin目录下还有文件a.txt.
运行tree(r"C:\Users\86158\Desktop\plogin")
输出:
Tree route:C:\Users\86158\Desktop\plogin
|-plogin ---<dir>
| |-a.txt ---<TXT file>
| |-a ---<dir>
| | |-b ---<dir>
| |-a2 ---<dir>
:param path: 路径
:return:
"""
print("Tree route:",path,sep="")
for a,b,c in os.walk(path,topdown=True):
nona="."+a.replace(path,"")
prog=nona.strip(".").split("\\")[-1]
z=len(nona.strip(".").split("\\"))-1
if prog=="":prog=a.split("\\")[-1]
prefix="|\t"*z+"|"
print(f"{prefix}-{prog} \t\t---<dir>")
prefix="|"+"\t"+prefix
for j in c:
print(prefix+"-",j,
f" \t\t---<{j.split('.')[-1].upper() if len(j.split('.'))>=2 else 'NONE_TYPE'} file>",sep="")
--效果--
tree(r"d:")
(节选)
| | | | | | | | | |-msg_34.txt ---<TXT file>
| | | | | | | | | |-msg_35.txt ---<TXT file>
| | | | | | | | | |-msg_36.txt ---<TXT file>
| | | | | | | | | |-msg_37.txt ---<TXT file>
| | | | | | | | | |-msg_38.txt ---<TXT file>
| | | | | | | | | |-msg_39.txt ---<TXT file>
| | | | | | | | | |-msg_40.txt ---<TXT file>
| | | | | | | | | |-msg_41.txt ---<TXT file>
| | | | | | | | | |-msg_42.txt ---<TXT file>
| | | | | | | | | |-msg_43.txt ---<TXT file>
| | | | | | | | | |-msg_44.txt ---<TXT file>
| | | | | | | | | |-msg_45.txt ---<TXT file>
| | | | | | | | | |-msg_46.txt ---<TXT file>
| | | | | | | | | |-PyBanner048.gif ---<GIF file>
| | | | | | |-encodings ---<dir>
| | | | | | | |-aliases.py ---<PY file>
| | | | | | | |-aliases.pyc ---<PYC file>
| | | | | | | |-ascii.py ---<PY file>
| | | | | | | |-base64_codec.py ---<PY file>
| | | | | | | |-big5.py ---<PY file>
| | | | | | | |-big5hkscs.py
就 很 好
---------------------
解析一下:
def tree表示创建函数tree。
接下来用os.walk来遍历目录。
然后通过判断路径来判断是否为子目录,目录层级,最后按照层级输出prefix(前缀)+文件。
------------------
接下来改进的2.0版通过分析文件名的获取途径判断了为路径【dir】还是文件【file】
-----------------
max版本则做到通过结尾判断类型,如没有后缀,则为NONE_TYPE文件。