文件树构造-使用python输出当前目录下的文件树结构并描述-python01

背景:将当前目录下的文件结构以树的形式输出,并在文件后面加上描述性信息。

刚接到这个需求的时候,我想这不是一个bash命令tree就可以了嘛,like this:

cd ~/04.workflow/08.scRNA_yanyt/03.reports_out/src #进入需要展示文件结构的路径
tree results/ #'展示文件结构
tree results >test.txt #'将文件结构保存到文件中
tree.png

后来小胖打开别人做的文件展示页面,告诉我每一个文件后面还需要有对应的描述性信息,那可能就需要写代码来做一下。这里我用python来实现:

import os
import os.path
import pandas as pd
import re
def dfs_showdir(path, depth,annoText):
    if depth == 0:
        print("|--"+path)
    for item in os.listdir(path):
        if item in ['.git', '.idea', '__pycache__']:
            continue  #'如果文件以.git等结尾,那么跳过
#'正则又来了,删掉文件中的数字,因为小胖的文件夹有很多一模一样like fplot1.png/flot2.png...
        pattern_item=re.sub("[0-9]","",item)  
#'输出文件结构
        print((" "*(depth+2))+"|--" +item+" "*4+annoText[annoText["files"]==pattern_item.split(".")[0]]["description"].tolist()[0])
        new_item = path + '/' + item
#'递归
        if os.path.isdir(new_item):
            dfs_showdir(new_item, depth + 1)


if __name__ == '__main__':
    #'构造文件说明数据框
    annoText_1=pd.DataFrame()
    annoText_1["files"]=["Feature_ber","hist","pearplot","Variable-ex","cycleplot"]
    annoText_1["description"]=["基因数目和测序深度相关性文件","测序深度分布文件","质控信息文件","高变基因可视化文件","细胞周期文件"]
    #'第二个文件信息构建
    annoText_2=pd.DataFrame()
    annoText_2["files"]=["umap","group","person","elbowplot","jackstrawplot","type_heatmap","cell_type","fplot","vln","celltype_singleR","Rplots","clusterplot","allmarker"]
    annoText_2["description"]=["umap聚类可视化文件","umap聚类可视化文件","umap聚类可视化文件","PCA降维PC可视化文件","PCA降维相关文件","细胞相似性文件","细胞类型注释可视化文件","聚类差异基因表达可视化(umap)文件","聚类差异基因表达可视化(小提琴图)文件","singleR注释细
胞类型与聚类类型对照表文件","***","***","差异基因文件"]
#'第三个文件信息构建
    annoText_3=pd.DataFrame()
    annoText_3["files"]=["sig_dge_all"]
    annoText_3["description"]=["***"]
    my_path="./03.reports_out/src/results/"
    print("流程的结果文件是{},包含文件有{}。".format(my_path, os.listdir(my_path)))
    print("root:[" + my_path + "]")
    for i in ["01.Data_filter","02.cell_cluster","03.DEG_enrichment"]:
        the_path=my_path+i
        if i=="01.Data_filter":
            dfs_showdir(the_path, 0,annoText_1)
        if i=="02.cell_cluster":
            dfs_showdir(the_path, 0,annoText_2)
        if i=="03.DEG_enrichment":
            dfs_showdir(the_path, 0,annoText_3)

展示一下吧:


tree.png

需求升级,不仅要描述文件信息,还要配置不同的颜色,首先使用python自带的print输出颜色,用法如下:

{
print("\33[31m"+"this is a test"+"\33[0m") #31代表红色
print("\33[33m"+"this is a test"+"\33[0m") #33黄色
print("\33[34m"+"this is a test"+"\33[0m") #34蓝色
print("\33[32m"+"this is a test"+"\33[0m") #32绿色
}

test.png

但是这个只能在python终端里输出,不能保存到文件里,直接在linux的bash命令行输入python test.py可以改颜色:
bash_python.png

但如果运行python test.py>test.txt保存到文件里就会失效:
txt_python.png

此时只能选择方法二:安装特定的模块pip install colorama

from colorama import Fore, Back, Style
Style.RESET_ALL #清空设置,回到默认颜色

colorama.png

参数是:
参数.png

爷彻底悟了,这和python不python 没有关系,文本能在终端显示颜色是靠linux终端来控制的,比如我直接在终端输入echo -e "\e[34m流程的结果文件是./03.reports_out/src/results/,包含文件有['04.Trajectory', '03.DEG_enrichment', '01.Data_filter', 'sce.rds', '02.cell_cluster']。\e[0m"
linux.png

文本颜色就直接改变了,python只是在字符串中加入了linux终端识别颜色的特点字符\e[34m等信息,那为啥输出到txt文件中linux终端就识别不了了呢?这和linux终端自己的查看命令有关系,当使用less test.txt时它无法识别字符中的颜色标识:
less.png

而当使用cat test.txt时它又认识了:
cat.png

那么问题来了,如何使用less命令也能认识颜色呢?能不能使用某种方法骗过linux终端,让它在使用less的时候以为自己在使用cat标准输出呢?我也搞不明白,付上一个别人的链接,我不敢试:
怎样把Linux命令行带颜色的输出保存到文件? - 知乎 (zhihu.com)
爷很无助...
秉持着不相信这个需求没办法实现的想法,我使用python构造html网页来展示:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import pandas as pd
from dominate.tags import *
import dominate
import pandas as pd
import os
import re
from dominate.util import text
def dfs_showdir(path, depth,annoText):
    if depth == 0:
        with li():
            span(path,cls="folder",style="color:blue")
            with ul():
                for item in os.listdir(path):
                    if item in ['.git', '.idea', '__pycache__']:
                        continue
                    pattern_item=re.sub("[0-9]","",item)
                    if pattern_item.split(".")[0] in annoText["files"].tolist():
                        with li():
                            span((" "*(depth+2))+"|--" +item+" "*4+annoText[annoText["files"]==pattern_item.split(".")[0]]["description"].tolist()[0],cls="file",style="color:red")
                    else:
                        with li():
                            span((" "*(depth+2))+"|--" +item+" "*4+"***nodescription",cls="files",style="color:yellow")
def main():
    #'构造信息表格
    if True:
        annoText_1 = pd.DataFrame()
        annoText_1["files"] = ["Feature_ber", "hist", "pearplot", "Variable-ex", "cycleplot"]
        annoText_1["description"] = ["基因数目和测序深度相关性文件", "测序深度分布文件", "质控信息文件", "高变基因可视化文件", "细胞周期文件"]
        # '第二个文件信息构建
        annoText_2 = pd.DataFrame()
        annoText_2["files"] = ["umap", "group", "person", "elbowplot", "jackstrawplot", "type_heatmap", "cell_type",
                            "fplot", "vln", "celltype_singleR", "Rplots", "clusterplot", "allmarker"]
        annoText_2["description"] = ["umap聚类可视化文件", "umap聚类可视化文件", "umap聚类可视化文件", "PCA降维PC可视化文件", "PCA降维相关文件", "细胞相似性文件",
                                     "细胞类型注释可视化文件", "亚群特异性高表达基因图(umap)文件", "亚群特异性高表达基因图(小提琴图)文件", "singleR注释细胞类型与聚类类型对照表文件"," ** * "," ** * ","差异基因文件"]
        # '第三个文件信息构建
        annoText_3 = pd.DataFrame()
        annoText_3["files"] = ["sig_dge_all"]
        annoText_3["description"] = ["***"]
        # '第四个文件信息构建
        annoText_4 = pd.DataFrame()
        annoText_4["files"] = ["test"]
        annoText_4["description"] = ["***"]

    html_root = dominate.document(lang="en", doctype="<!DOCTYPE html>", title="this is a test")
    with html_root.head:
        meta(name="viewport",content="width=device-width, initial-scale=1.0")
        link(rel="stylesheet",href="css/jquery.treeview.css")
        script(src="js/jquery.min.js")
        script(src="js/jquery.treeview.js",type="text/javascript")
        script(type="text/javascript",src="js/myjs1.js")
    my_path="./src/results/"
    with html_root.body:
        with div(id="main"):
            with ul(id="treeview",cls="filetree"):
                for i in ["01.Data_filter", "02.cell_cluster", "03.DEG_enrichment", "04.Trajectory"]:
                    the_path = my_path + i
                    if i == "01.Data_filter":
                        dfs_showdir(the_path, 0, annoText_1)
                    if i == "02.cell_cluster":
                        dfs_showdir(the_path, 0, annoText_2)
                    if i == "03.DEG_enrichment":
                        dfs_showdir(the_path, 0, annoText_3)
                    if i == "04.Trajectory":
                        dfs_showdir(the_path, 0, annoText_4)
    with open('E:/***/01.资料/05.html_test/05.files_test/src/test.html','w') as f:
        f.write(html_root.render())
if __name__ =='__main__':
    main()

打开生成的网页看看吧:


html.png

诶,点击图标还能收缩:


html.png

总结:文件名字要规范,通常是字母_数字.文件扩展名,养成好习惯很重要。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容