目的很简单,就是遍历文件夹得到目录树,可以不需要再双击文件夹,一个一个的去找文件再双击打开,将无数次的无效点击,变成一次单击便能查看想要查看的文件。
当然了,遍历文件夹是基础操作,批量操作必定要一个一个的来,但是我们在工作中可能也只是需要辅助一下,让我们可以简单地只去动动脑子,而不用枯燥的重复。
那么首先,问,手工怎么遍历?
打开文件夹,看看里面有啥,文件的话,写到树上,文件夹的话,写到树上,接着往里面打开,直到没有可以打开的东西。
可以看出,这是一个枯燥而且无聊的操作,如果文件夹多了,还可能会漏。非常适合用Python这种脚本语言来解决。
根据以上便可得到一个框架
import os, os.path
def get_dir_list(path):
# 看看哪些是文件夹哪些是文件
folder_list = [folder for folder in os.listdir(path) if os.path.isdir(os.path.join(path, folder))] # 全部子文件夹名称
file_list = [file for file in os.listdir(path) if os.path.isfile(os.path.join(path, file))] # 全部子文件名称
for folder in folder_list:
print(folder) # 写文件夹名
get_dir_list(os.path.join(path, folder)) # 内层文件夹进深一层,并搜索
for file in file_list:
print(file) # 写文件名
if __name__ == '__main__':
main_path = "C:\\test"
# 打开文件夹
get_dir_list(main_path)
运行完可以看出,结果非常简单,甚至都看不出哪个是文件哪个是文件夹。
因此内层文件名需要缩进。如下
TAB = ' '
def get_dir_list(path, placeholder=''):
...
for folder in folder_list:
print(placeholder + folder) # 写文件夹名
get_dir_list(os.path.join(path, folder), placeholder + TAB) # 内层文件夹进深一层,并搜索
for file in file_list:
print(placeholder + file) # 写文件名
当然了,生成的目录树还可以更好看一些,这里不再单独列出。
得到目录树之后呢,最好是直接保存到txt文本文档里面,为了好看,每个块的最后一行单独做个拐角,如下
import os, os.path
BRANCH = '├─'
LAST_BRANCH = '└─'
TAB = '│ '
EMPTY_TAB = ' '
def get_dir_list(path, placeholder=''):
# 看看哪些是文件夹哪些是文件
folder_list = [folder for folder in os.listdir(path) if os.path.isdir(os.path.join(path, folder))] # 全部子文件夹名称
file_list = [file for file in os.listdir(path) if os.path.isfile(os.path.join(path, file))] # 全部子文件名称
for folder in folder_list:
if folder != folder_list[-1]:
txt_index.write(placeholder + BRANCH + folder + '\n')
else:
txt_index.write(placeholder + (BRANCH if file_list else LAST_BRANCH) + folder + '\n')
get_dir_list(os.path.join(path, folder), placeholder + TAB) # 内层文件夹进深一层,并搜索
for file in file_list:
if file != file_list[-1]:
txt_index.write(placeholder + BRANCH + file + '\n')
else:
txt_index.write(placeholder + LAST_BRANCH + file_list[-1] + '\n')
if __name__ == '__main__':
main_path = "C:\\test"
# 打开文件夹
with open('目录.txt','w') as txt_index:
txt_index.write(fold_path+"\n")
get_dir_list(main_path)
txt_index.close()
最后,我们当然不能只满足于看看,还想点了目录直接打开文件,那就不能用.txt来存储了,需要请出Excel。
这里,我使用的是 xlwt ,使用 win+r进入DOS界面,键入pip install xlwt 即可。
在这个小应用中,所需要的,不过是需要在单元格中写上超链接的公式而已,
但是这个路径有两种用法,
第一种是用相对路径打开超链里的文件,比如 "test\\*txt" ,excel表格本身必须在主目录下面;
第二种是用绝对路径打开文件,比如 "C:\\test\\*txt",如果文件放到了其他电脑上,文件夹也得在 "C:\\" 路径下。
格式如下:
link ='HYPERLINK("%s";"%s")'%(folder_path,folder)
sheet_index.write(line, placeholder.count(TAB), xlwt.Formula(link))
line = line + 1
在程序中加入此部分,可以完成本次的简单应用。以下代码,完成了绝对路径与相对路径两种目录的生成,还加入了跳过、删除空白文件夹以及错过部分特定后缀文件的功能:
import os, os.path, xlwt
BRANCH = '├─'
LAST_BRANCH = '└─'
TAB = '│ '
EMPTY_TAB = ' '
global line
# 遍历当前文件夹下的子文件夹和文件
def get_dir_list(path, placeholder=''):
global line
folder_list = [folder for folder in os.listdir(path) if os.path.isdir(os.path.join(path, folder))] # 全部子文件夹名称
file_list = [file for file in os.listdir(path) if os.path.isfile(os.path.join(path, file))] # 全部子文件名称
for folder in folder_list:
folder_path = os.path.join(path, folder)
if list(os.listdir(folder_path)):
# 文件夹名 写入文本文档,并添加缩进
if folder != folder_list[-1]:
txt_index.write(placeholder + BRANCH + folder + '\n')
else:
txt_index.write(placeholder + (BRANCH if file_list else LAST_BRANCH) + folder + '\n')
# 写入Excel并增加超链接
link = 'HYPERLINK("%s";"%s")'%(folder_path.replace(main_path+"\\",""),folder) # 相对路径
sheet_index.write(line, placeholder.count(TAB), xlwt.Formula(link))
link = 'HYPERLINK("%s";"%s")'%(folder_path,folder) # 绝对路径
sheet_index2.write(line, placeholder.count(TAB), xlwt.Formula(link))
line = line + 1
get_dir_list(folder_path, placeholder + TAB) # 内层文件夹进深一层,并搜索
else:
os.rmdir(folder_path) # 删除空文件夹
for file in file_list:
if str.upper(os.path.splitext(file)[-1]) not in [".TIF", ".PNG","JPG"]:
file = file.replace("‑","")
# 文件名 写入文本文档,并添加缩进
try:
if file != file_list[-1]:
txt_index.write(placeholder + BRANCH + file + '\n')
else:
txt_index.write(placeholder + LAST_BRANCH + file_list[-1] + '\n')
except UnicodeEncodeError:
txt_index.write(placeholder + BRANCH + "特殊字符,无法写入txt文件!!!" + '\n')
print("这个文件名里有特殊字符:"+ file)
link ='HYPERLINK("%s";"%s")'%(os.path.join(path, file).replace(main_path+"\\",""),file)
sheet_index.write(line, placeholder.count(TAB), xlwt.Formula(link))
link = 'HYPERLINK("%s";"%s")'%(os.path.join(path, file),file)
sheet_index2.write(line, placeholder.count(TAB), xlwt.Formula(link))
line = line + 1
if __name__ == '__main__':
line = 0
book = xlwt.Workbook()
main_path = "C:\\test"
sheet_index = book.add_sheet('相对路径') # 目录必须放置于 main_path 下
sheet_index2 = book.add_sheet('绝对路径') # 不同电脑上 main_path 得相同
with open(main_path+"\\"+'目录.txt','w') as txt_index:
txt_index.write(main_path+"\n")
get_dir_list(main_path)
txt_index.close()
book.save(main_path+"\\"+'目录.xls')
print("完成了!")