栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


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 
    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"33[3{num}m{string}33[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规范(说明文档的规范写法)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1000694.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号