“伪”Linux目录树命令tree——几行代码一个递归,就可以在python代码中tree


Python 官网:https://www.python.org/



  • 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.pathdef 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 treeitems = 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】

好文力荐:
  • 全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。

  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛

  • 靠谱程序员的好习惯


CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部