“伪”Linux目录树命令tree——几行代码一个递归,就可以在python代码中tree
“伪”Linux目录树命令tree——几行代码一个递归,就可以在python代码中tree
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚

- 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) # 打印目录列完分割线。
__上一篇:__ 中文姓名提取(玩具代码——准头太小,权当玩闹)
__下一篇:__ 练习:试炼自然常数e
我的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】
好文力荐:
-
全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。
CSDN实用技巧博文:

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)