程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

“偽”Linux目錄樹命令tree——幾行代碼一個遞歸,就可以在python代碼中tree

編輯:Python

Python 官網 python 前沿。可惜是英文原版。所以,我要練習英文閱讀。🧐🧐" rel="noopener noreferrer">https://www.python.org/


  • Free:大咖免費“聖經”教程《 python 完全自學教程》,不僅僅是基礎那麼簡單……

  • My CSDN主頁、My HOT博、My Python 學習個人備忘錄
  • 好文力薦、 老齊教室

自學並不是什麼神秘的東西,一個人一輩子自學的時間總是比在學校學習的時間長,沒有老師的時候總是比有老師的時候多。
—— 華羅庚





“偽”Linux目錄樹命令tree
——幾行代碼一個遞歸,就可以在python代碼中tree




目 錄

  • 1、寒佬出題
  • 2、“研究”老師tree源碼
  • 3、遞歸實現tree
  • 4、class封裝代碼,“復刻”tree
  • 5、遞歸實現tree
  • 6、本練習完整源碼

回首頁


寒佬在QQ學習群“Python全棧技術學習交流”發問:
你能用python代碼實現Linux目錄文件列印命令tree的功能麼?
真像群友所言“難度蹭蹭蹭一下子就上來了”啊!我只能一臉懵逼的發呆。🥴

稍瞬,就有人貼出了代碼:

import os
import os.path
def tree(path, depth=0):
if depth == 0:
print(path)
items = os.listdir(path)
for item in items:
# 輸出文件夾中的文件和子文件夾名
print('| '*depth, end='')
print('|----', item)
item = os.path.join(path, item)
if os.path.isdir(item):
# 遞歸遍歷子目錄
tree(item, depth+1)
tree(r'')

完了發現是我老師“淡墨-工作號”(他雖然還是個小小的學生娃兒,可是懂得不少,我從他那兒學到了些好東西。ZeroTermux這安卓版的虛擬Linux,亦是他帶我入門的,不然我可沒現在方便run代碼。不曉得啥時候起,我就習慣叫他“老師”了。)
寒佬鼓勵我們“復刻”tree代碼,我也“躍躍欲試”。


回首頁


細看代碼,比天書好些,能認得26個字母。這短短幾行代碼,真有tree之能?我立即CV→run。居然報錯!!


Traceback (most recent call last):
File "/storage/emulated/0/qpython/tree.py", line 18, in <module>
tree(r'')
File "/storage/emulated/0/qpython/tree.py", line 8, in tree
items = os.listdir(path)
FileNotFoundError: [Errno 2] No such file or directory: ''

報錯圖

原來我照搬了老師的代碼,居然不給tree()給參數。🥴🥴修改tree函數調用語句:

tree(r'../001/')

回首頁


Run老師代碼,看她神奇實現tree命令功用。

效果立顯。
這,還真是“奇妙”🧐🧐。


仔細“研讀”,惡補不會的知識,一天後的現在,能懂得起老師的代碼了。想要動手再現。復現tree能力用到了os模塊的目錄下文件名稱字符串列表獲取方法listdir(pathname),返回目錄下所有文件(或文件夾)名稱字符串列表。判斷字符串是目錄名稱還是文件名稱,用os模塊下子模塊path的isdir(pathname)方法,返回True或者False。


回首頁


上碼


from os.path import isdir # 加載os模塊子模塊path的isdir()方法。
from os.path import join # 加載os模塊子模塊path的join()方法。
from os import listdir #listdir # 加載os模塊listdir()方法。
path = '../001/re_Chinese_name' # 設置要處理的目錄。
print(f"\n“{
path}”是目錄? → {
isdir(path)}") # 判斷目錄。
for i in listdir(path):
pathname = join(path, i)
print(f"“{
pathname}”是目錄? → {
isdir(pathname)}") # 判斷目錄下文件或者次級目錄。
print(isdir'00000)

輸出

/sdcard/qpython $ python mytree.py
“../001/re_Chinese_name”是目錄? → True
“../001/re_Chinese_name/data”是目錄? → True
“../001/re_Chinese_name/re_Chinese_name.py”是目錄 ? → False

截屏圖片

os.path.isdir()方法的坑:隨便給個字符串,都不會報錯,只是返回False。我開頭沒有拼接完成路徑用isdir()方法,得到了“錯誤”判定,一直懵逼調試中。累得“半死”才出坑。


os.path.isdir('00000') # 隨便給個字符串,都不會報錯,只是返回False。

os.path.join()方法同字符串的.join()方法,語法略有不同。(此例是偽代碼)

a, b = 上級目錄名,次級目錄名或文件名
os.path.join(a, b)
'/'.join((a, b)) # 或者'/'.join([a,b]) ,這個方法接一個參數,用元組或列表都可以。

回首頁


完成代碼封裝後,就可以簡潔地tree了。


if __name__ == '__main__':
path = 'projects3/power_mom/' # 設置要處理的目錄。
mytree = MyTree() # 實例類。
mytree.tree(path) # 偽tree方法調用。
print('-'*50) # 打印目錄列完分割線。

代碼運行效果


回首頁


復現老師代碼的完整源碼


#!/sur/bin/nve python
# coding: utf-8
''' filename = 'mytree.py' author = '夢幻精靈_cq' time = '2022-07-01' '''
class MyTree:
''' python 實現Linux目錄樹命令tree之能 '''
def tree(self, folder, depth=0):
''' 復刻Linux命令tree '''
from os import listdir # 加載os模塊獲取路徑下所有文件列表方法。
from os.path import isdir # 加載os模塊子模塊path的判定目錄方法。
from os.path import join # 加載os模塊子模塊path的目錄拼接方法。
from os.path import abspath # 加載os模塊獲取給定路徑絕對路徑方法。
if depth == 0: # 第一層目錄,藍色打印絕對路徑。
print(f"\n{
self.f_color(abspath(folder), 4)}\n{
'-'*50}")
for name in listdir(folder): # 遍歷目錄文件列表打印。
if isdir(name2 := join(folder, name)): # 藍色打印目錄。
print(f"{
'| '*depth}|{
'-'*4}{
self.f_color(name, 3)}")
self.tree(name2, depth+1) # 遞歸遍歷次級目錄。
else: # 黃色打印文件。
print(f"{
'| '*depth}|{
'-'*4}{
self.f_color(name, 4)}")
def f_color(self, string, num):
''' 字符串設置打印前景色 '''
return f"\033[3{
num}m{
string}\033[0m"
if __name__ == '__main__':
path = 'projects3/power_mom/' # 設置要處理的目錄。
mytree = MyTree() # 實例類。
mytree.tree(path) # 偽tree方法調用。
print('-'*50) # 打印目錄列完分割線。


回首頁

__上一篇:__ 中文姓名提取(玩具代碼——准頭太小,權當玩鬧)

__下一篇:__

我的HOT博:

  • 練習:銀行復利計算(用 for 循環解一道初中小題)(1055閱讀)
  • pandas 數據類型之 DataFrame(1335閱讀)
  • 班裡有人和我同生日難嗎?(概率probability、蒙特卡洛隨機模擬法)(2083閱讀)
  • Python字符串居中顯示(1491閱讀)
  • 練習:求偶數和、阈值分割和求差( list 對象的兩個基礎小題)(1642閱讀)
  • 用 pandas 解一道小題(1966閱讀)
  • 可迭代對象和四個函數(1066閱讀)
  • “快樂數”判斷(1227閱讀)
  • 羅馬數字轉換器(構造元素取模)(1934閱讀)
  • Hot:羅馬數字(轉換器|羅生成器)(3612閱讀)
  • Hot:讓QQ群昵稱色變的代碼(26891閱讀)
  • Hot:斐波那契數列(遞歸| for )(4038閱讀)
  • 柱狀圖中最大矩形(1647閱讀)
  • 排序數組元素的重復起止(1237閱讀)
  • 電話撥號鍵盤字母組合(1344閱讀)
  • 密碼強度檢測器(1792閱讀)
  • 求列表平衡點(1813閱讀)
  • Hot: 字符串統計(4283閱讀)
  • Hot:尼姆游戲(聰明版首發)(3417閱讀)尼姆游戲(優化版)(982閱讀)
推薦條件點閱破千

回目錄


精品文章:

  • 好文力薦:《python 完全自學教程》齊偉書稿免費連載
  • OPP三大特性:封裝中的property
  • 通過內置對象理解python'
  • 正則表達式
  • python中“*”的作用
  • Python 完全自學手冊
  • 海象運算符
  • Python中的 `!=`與`is not`不同
  • 學習編程的正確方法

來源:老齊教室


回目錄

Python 入門指南【Python 3.6.3】


好文力薦:

  • 全棧領域優質創作者——寒佬(還是國內某高校學生)好文:《非技術文—關於英語和如何正確的提問》,“英語”和“會提問”是學習的兩大利器。

  • 【8大編程語言的適用領域】先別著急選語言學編程,先看它們能干嘛

  • 靠譜程序員的好習慣


CSDN實用技巧博文:

  • 8個好用到爆的Python實用技巧
  • python忽略警告
  • Python代碼編寫規范
  • Python的docstring規范(說明文檔的規范寫法)


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved