Python 官網: python 前沿。可惜是英文原版。所以,我要練習英文閱讀。🧐🧐" rel="noopener noreferrer">https://www.python.org/
自學並不是什麼神秘的東西,一個人一輩子自學的時間總是比在學校學習的時間長,沒有老師的時候總是比有老師的時候多。
—— 華羅庚
寒佬在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) # 打印目錄列完分割線。
來源:老齊教室
全棧領域優質創作者——寒佬(還是國內某高校學生)好文:《非技術文—關於英語和如何正確的提問》,“英語”和“會提問”是學習的兩大利器。
【8大編程語言的適用領域】先別著急選語言學編程,先看它們能干嘛
靠譜程序員的好習慣