首页 > 编程语言 >python实现输出文件夹的目录树结构

python实现输出文件夹的目录树结构

时间:2022-11-26 13:11:41浏览次数:40  
标签:files last 树结构 python 文件夹 print path txt

最近清理QQ文件夹的时候, 发现群聊图片巨TM大, 就想看看群友们都发了什么怪图片
但是QQ群聊图片文件夹里面的文件夹是一个套一个, 靠手工copy肯定是不太行的, 就写了个简单的脚本遍历里面所有的文件

之后在用tree命令的时候想了想, 自己能不能也简单实现下类似tree的目录的树状结构的打印

我们来一步一步实现一下

遍历文件夹内的所有文件

首先简单递归遍历一个文件夹

import os

def get_all_file(path):
    files = []
    items = os.listdir(path)
    for i in items:
        i_path = path + "/" + i
        if os.path.isdir(i_path):
            files.extend(get_all_file(i_path))
        else:
            files.append(i_path)
    return files

分析tree命令的输出

输出树状结构可以把文件目录按树数据结构进行保存打印输出

不过既然遍历了所有文件和文件夹, 我本身通过就可以判断当前的层数来输出对应的树干和树枝

我新建了一个文件夹, 在里面嵌套了一些文件夹和文件, 先简单看下tree命令是怎么输出这个文件夹的结构的

├── 1
│  ├── 11
│  ├── 12
│  └── 13
├── 1.txt
├── 2
│  ├── 21
│  └── 22
│     ├── 3
│     │  └── 1.txt
│     └── 3 - 副本
│        └── 1.txt
└── 3
   ├── 1.txt
   └── 31
      └── 1.txt

输出树的形状用了 │ ├ └ ─ 四种符号来表示树干, 树枝分支 和 最后一个树枝

分析一下分支形状输出的逻辑

  1. 当前层不是最后一枝, 那么就使用 作为分支形状, 是最后一枝则用 作为分支形状

  2. 之间要用 进行连接, 之后则不需要

其中第2点可以这样判断, 判断父节点是不是最后一枝, 不是则输出 来连接树干

具体实现

通过当前层级所在的目录列表的下标和列表长度判断当前文件/文件夹是不是最后一枝

然后需要一个参数depth表示当前层数, 递归的时候depth=depth+1来表示层数增加

def print_folder_tree(path, depth=0):
    files = []
    items = os.listdir(path)
    for index, i in enumerate(items):
        # 是否是最后一个元素
        is_last = index == len(items) - 1
        # 拼接文件路径
        i_path = path + "/" + i
        # 根据层数打印空格
        print("   " * depth,end="")
        if is_last:
            print("└── ", end="")
        else:
            print("├── ", end="")
        # 如果是文件夹, 递归
        if os.path.isdir(i_path):
            print(i)
            files.extend(print_folder_tree(path=i_path, depth=depth + 1))
        # 如果是文件就把路径添加到files数组
        else:
            print(i_path.split("/")[-1])
            files.append(i_path)
    return files  

代码输出的结果是这样, 可以看到层级显示正常

├── 1
   ├── 11
   ├── 12
   └── 13
├── 1.txt
├── 2
   ├── 21
   └── 22
      ├── 3
         └── 1.txt
      └── 3 - 副本
         └── 1.txt
└── 3
   ├── 1.txt
   └── 31
      └── 1.txt

接下来需要输出树干 , 但是树干的输出需要根据父节点, 父节点的父节点...是否是所在层级的最后一枝来输出

├── 2
│	├── 21
│	└── 22
│		├── 3
│		│	└── 1.txt
│		└── 3 - 副本
│			└── 1.txt

我这里使用parent_is_last, 来1和0表示每个父节点是否为最后一支, 有点像独热码(One Hot Encode)

22 -> 3 -> 1.txt 为例, 所在层级是3, parent_is_last就是1010, 首位1忽略, 就是010, 所以它往上三层父节点的 树干就是 有 没有 有

然后加上了控制遍历深度和空格宽度的参数

具体实现如下

def print_folder_tree(path, parent_is_last=1, depth_limit=-1, tab_width=1):
    """
    以树状打印输出文件夹下的文件, 并返回文件夹内的所有文件
    :param tab_width: 空格宽度
    :param path: 文件夹路径
    :param depth_limit: 要输出文件夹的层数, -1为输出全部文件及文件夹
    :param parent_is_last: 递归调用上级文件夹是否是最后一个文件(夹), 控制输出 │ 树干
    :return: 返回path下的所有文件的数组
    """
    files = []
    if len(str(parent_is_last)) - 1 == depth_limit:
        return files
    items = os.listdir(path)
    for index, i in enumerate(items):
        is_last = index == len(items) - 1
        i_path = path + "/" + i
        for k in str(parent_is_last)[1:]:
            if k == "0":
                print("│" + "\t" * tab_width, end="")
            if k == "1":
                print("\t" * tab_width, end="")
        if is_last:
            print("└── ", end="")
        else:
            print("├── ", end="")
        if os.path.isdir(i_path):
            print(i)
            files.extend(print_folder_tree(
                path=i_path, depth_limit=depth_limit, parent_is_last=(parent_is_last * 10 + 1) if is_last else (parent_is_last * 10)))
        else:
            print(i_path.split("/")[-1])
            files.append(i_path)
    return files

最后代码的运行结果是这样的

├── 1
│	├── 11
│	├── 12
│	└── 13
├── 1.txt
├── 2
│	├── 21
│	└── 22
│		├── 3
│		│	└── 1.txt
│		└── 3 - 副本
│			└── 1.txt
└── 3
	├── 1.txt
	└── 31
		└── 1.txt

标签:files,last,树结构,python,文件夹,print,path,txt
From: https://www.cnblogs.com/marushiru/p/16925658.html

相关文章

  • python 离线安装项目所有库及依赖
     1. 将本地所有库名称写入一个txtpipfreeze> d:\requirements.txt2.将txt所有库名称,打包下载到本地pipdownload -d d:\res\-rrequirements.txt  3. 将库复制......
  • 使用VSccde上传文件到Git时报错:fatal:Custom certificate bundle not found at path:
    问题原因错误分析:这个是本地下载的Git没有在里面安装好证书导致的,所以要卸载git重新安装Git就会自动安装证书解决方法我们需要在控制面板>用户账户>凭据管理器>Windows凭......
  • 使用Python查询国内 COVID-19 疫情
    首先,我们使用 ​​Tkinter​​​ 库使我们的​​脚本​​可以图形化显示。使用 ​​requests​​ 库从丁香园获取数据。然后我们将在这种情况下显示我们需要的数据“......
  • Python: Pycharm可以运行但是VSCode总是报错ModuleNotFound
    最近遇到Pycharm和VSCode上去运行同样的代码,Pycharm上可以正常运行,但是VSCode总是报错说ModuleNotFound,折腾了一番后发现VSCode是需要做配置才能正常运行。代码结构:......
  • 使用Python进行交易策略和投资组合分析
    我们将在本文中衡量交易策略的表现。并将开发一个简单的动量交易策略,它将使用四种资产类别:债券、股票和房地产。这些资产类别的相关性很低,这使得它们成为了极佳的风险平衡......
  • python checklist
    1.常用模块:subprocess,requests,paramekio,traceback,argparse,numpy,pandas2.赋值传递和引用传递  python是赋值传递参数:   https://blog.csdn.net/Lj......
  • 让你的Python代码更干净只需简单一步
    你可以将这两个文件拷贝到自己的项目根目录中,然后执行一次pre-commitinstall,这样每次提交代码的时候,都是干净的代码,是不是很方便?说起来容易做起来难,我们都知道代码可读性......
  • Python:ValueError: Unable to find resource t64.exe in package pip._vendor.distlib
    背景由于pip版本过高22.3.1,安装下载pip20.2.4时报以下错误ValueError:Unabletofindresourcet64.exeinpackagepip._vendor.distlib解决方案:卸载setuptools......
  • 用YAPF让Python代码瞬间从丑陋变漂亮
    要把Python代码写漂亮,必须遵循PEP8Python编码规范:《​​PEP8--StyleGuideforPythonCode​​​》。但记住PEP8规范,是一件非常痛苦的事情,还好Google发布了一个自动整......
  • 用Python代码画世界杯吉祥物拉伊卜(附代码)
    用Python代码画世界杯吉祥物拉伊卜(附代码)世界杯正在火热进行中,世界杯的吉祥物拉伊卜也非常火。本文用Python代码画世界杯吉祥物。不废话,可以直接先看视频效果。视频效果用P......