生成带超链的Excel文件目录

目的很简单,就是遍历文件夹得到目录树,可以不需要再双击文件夹,一个一个的去找文件再双击打开,将无数次的无效点击,变成一次单击便能查看想要查看的文件。

当然了,遍历文件夹是基础操作,批量操作必定要一个一个的来,但是我们在工作中可能也只是需要辅助一下,让我们可以简单地只去动动脑子,而不用枯燥的重复。

那么首先,问,手工怎么遍历?

打开文件夹,看看里面有啥,文件的话,写到树上,文件夹的话,写到树上,接着往里面打开,直到没有可以打开的东西。

可以看出,这是一个枯燥而且无聊的操作,如果文件夹多了,还可能会漏。非常适合用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("完成了!")

 

你可能感兴趣的:(Python)