python实现的txt目录树
首先,我先表述一下我的需求:
我记笔记比较乱,但我比较容易"半途而废".文件夹很多,但大都只有一两个文件....
所以我需要一种方式,能在不逐个打开文件夹的前提下,"看到每个文件的名字和位置"
最后发现,我需要的应该是目录树.....不过我不需要制表符,要统统使用tab
那就撸起袖子开干
#总体框架 os.walk()获取全部路径,文件名信息 将上面得到的数据转换为文本 写入txt 启动记事本打开写好的txt
第一部分,一步搞定φ(>ω<*)
#代码: import os print(list(os.walk("."))) #运行结果 [('.', ['示例'], ['ls.py', 'mian.py', '新增.py']), ('.\\示例', [], ['a.txt'])]
'''文件结构 示例 a.txt ls.py mian.py 新增.py '''
PS: "." 代指当前目录
第二部分,最重要的部分,将第一部分得到的数据"文本化"
每个三元数组都是(路径,文件夹,文件)的格式,
那就写个函数将它换成文本
#转化为文本 def to_txt(路径): 定义一个空list 得到此路径下的子文件夹,子文件名字 写入文件夹自身的名字 将每个子文件夹"文本化" 并塞入list 将每个文件名加上"\n" 并塞入list return list
为了方便根据路径名得到 文件的信息
将第一步的得到的三元元组的列表 转换的成 以路径为键, 的字典
import os list_way = (list(os.walk("."))) dict_way = dict( zip( [ i[0] for i in list_way] , list_way ) ) for i in dict_way: print(i ,end = " ") print(dict_way[i]) ''' ================运行结果==================== .\示例 ('.\\示例', [], ['a.txt']) . ('.', ['示例'], ['ls.py', 'mian.py', 'txt.bj', '新增.py']) '''
PS:文件夹层数越多,前面的缩进就越多
import os list_way = (list(os.walk("."))) dict_way = dict( zip( [ i[0] for i in list_way] , list_way ) ) def to_txt(way): l = [ ] three = dict_way[ way ] #根据路径获取三元元组 tab_num = way.count("\\") #计算缩进数量, 缩进<=>文件层数<=>路径中\的个数 if tab_num: #如果路径中不含\ <=> 路径为"." <=> TAB_num == 0 #此时不用打文件夹名字 <=> 根目录 l.append("\t" * (tab_num - 1)+way.split("\\")[ -1 ] + "\n" ) #打出文件夹名字 #文件夹名字是路径里面"最后一个\"后面的部分 #文件名字,与上一级文件同级,故少个Tab for i in three[1]: #遍历子文件夹们 l = l + to_txt( way+"\\"+i ) #拼接路径,调用自身,实现子文件夹文本化 #鉴于返回值是列表 所以用"+"而非append for i in three[2]: #遍历子文件们 l.append( "\t" * tab_num + i +"\n") #加Tab,加换行 return l #返回弄好的文本 l = to_txt(".") for i in l: print(i, end ="") ''' ========运行结果=========== 示例 a.txt ls.py mian.py txt.bj 新增.py '''
下面奉上无注释版
import os list_way = (list(os.walk("."))) dict_way = dict( zip( [ i[0] for i in list_way] , list_way ) ) def to_txt(way): l = [ ] three = dict_way[ way ] tab_num = way.count("\\") if tab_num: l.append("\t" * (tab_num - 1)+way.split("\\")[ -1 ] + "\n" ) for i in three[1]: l = l + to_txt( way+"\\"+i ) for i in three[2]: l.append( "\t" * tab_num + i +"\n") return l l = to_txt(".") for i in l: print(i, end ="") ''' =================== 示例 a.txt ls.py mian.py txt.bj 新增.py '''
第三部分和第四部分
写入txt,打开记事本
list_txt = to_txt(".") with open("目录树.txt","w") as fil: for i in list_txt: fil.write(i) os.system('notepad 目录树.txt')
完了...
全部的代码
import os list_way = (list(os.walk("."))) dict_way = dict( zip( [ i[0] for i in list_way] , list_way ) ) def to_txt(way): l = [ ] three = dict_way[ way ] tab_num = way.count("\\") if tab_num: l.append("\t" * (tab_num - 1)+way.split("\\")[ -1 ] + "\n" ) for i in three[1]: l = l + to_txt( way+"\\"+i ) for i in three[2]: l.append( "\t" * tab_num + i +"\n") return l list_txt = to_txt(".") with open("目录树.txt","w") as fil: for i in list_txt: fil.write(i) os.system('notepad 目录树.txt')
撒花✿✿ヽ(°▽°)ノ✿
-end-
另外,我的目录树后缀是.bj
我已经将它设成了默认EditPlus打开....
搭配 折叠/收起 食用更佳
我是ansver我的answer只能信一半