python3制作文件管理系统--Apple的学习笔记

动机:

由于我学习的内容比较杂,文件夹中的学习资料有点多,有点乱。这影响了系统性学习及复习,以及快速搜索关键资料的效率。而目前我有几千份文件若重新归档,工作量太大了。所以我想利用python制作文件管理系统,进行自动化管理,并且可以按关键字快速搜索到想复习的资料。

立项:对于自动文件归档整理功能如下。

  1. 用python将目前学习文件夹下已经存在文件名+路径+修改日期都识别出来,保存到excel中。
  2. 在excel中可以自己添加标签,来备注此文件的关键字。(也可以不加)
  3. 当此文件夹下有文件更新(包括新增,删除,修改,重命名),在运行python文件管理系统后,可以识别出来并且更新到excel中。

那么将来在表格中文件名称或标签就可以实现快速搜索到想要看的资料,可以按修改日期来复习3个月前学习的资料。

设计代码框架:

前提是新建一个空白的xls的表格。主要设计思路如下图:


主要流程图.png

代码:

代码及我的测试文件夹,都已经上传github(https://github.com/AppleCai/FileSystemManagement)

'''
@Description: File System Management
@Author: AppleCai
@Date: 2019-09-08 9:25:19
@LastEditTime: 2019-09-08 14:24:13
'''
import os
import time
import xlrd
import xlwt
from xlutils.copy import copy

myTagSearchKeyWord="Eng"  #搜索标签列中的关键字
myFileSystem=[]    #excel表格中的list
myfilelist=[]      #实际扫描当前的文件list

excelfile = 'AppleCai的文件管理系统.xls' #文件信息系统名称
file_dir = r"F:\t1" #需要管理的文件夹
col_data=1  #文件修改时间在第1列
col_name=0  #文件名在第0列

'''
 * @description: 对已经存在于表格中的数据进行更新
 * @param:path是Excel文件名称,value是要写入文件的所有数据
 * @return: 无
'''
def UpdateExcel(path, value):
    index = len(value)  # 获取需要写入数据的行数
    workbook = xlwt.Workbook()  # 新建一个工作簿
    sheet = workbook.add_sheet("目录")  # 在工作簿中新建一个表格
    for i in range(0, index):
        for j in range(0, len(value[i])):
            sheet.write(i, j, value[i][j])  # 像表格中写入数据(对应的行和列)
    workbook.save(path)  # 保存工作簿
    print("表格更新数据成功!")

'''
 * @description: 读取已存在文件的信息
 * @param:path是Excel文件名称
 * @return: 读取的行数
'''
def readExcel(path):
    workbook = xlrd.open_workbook(path)  # 打开工作簿
    sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
    worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
    for i in range(worksheet.nrows):
        col = worksheet.row_values(i)  ##获取每一列数据
        #print(col)
        myFileSystem.append(col)
    return(len(myFileSystem))

'''
 * @description: 即时扫描文件夹获取目录下的文件信息
 * @param:file_dir是当前扫描的目录
 * @return: 
'''
def fileReader(file_dir):
    for root, dirs, files in os.walk(file_dir):
        for file in files:
            full_path = os.path.join(root, file)
            #需要进行管理的文件名称后缀
            if((os.path.splitext(full_path)[1]=='.txt') or
                (os.path.splitext(full_path)[1] == '.xls') or
                (os.path.splitext(full_path)[1] == '.xlsx') or
                (os.path.splitext(full_path)[1] == '.pdf')  or
                (os.path.splitext(full_path)[1] == '.doc')  or
                (os.path.splitext(full_path)[1] == '.docx') or
                (os.path.splitext(full_path)[1] == '.md')):
                absPath=os.path.dirname(full_path)       # 打印出来为双斜杠,所以需要修改
                absFileName=os.path.basename(full_path)
                mtime = os.path.getmtime(full_path)
                file_modify_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(mtime))
                #格式为文件名,修改时间,Tag,文件路径
                myfilelist.append((absFileName,file_modify_time,"",absPath.replace('\\','/')))
                #myfilelist.append(os.path.split(file_path)) #返回二元,一个为路径,一个为名称,但是没法直接替换斜杠

'''
 * @description: 将扫描后的文件信息和Excel中已经存在的信息对比,进行添加,删除,修改。并保持到myFileSystem中
 * @param:
 * @return: 
'''
def fileHandler():

    listdata = [x[col_data] for x in myFileSystem[1:]]  #获取所有文件修改时间
    listName = [x[col_name] for x in myFileSystem[1:]]  #获取所有文件名称
    listNameNew= [x[col_name] for x in myfilelist]  #获取所有目前扫描出的文件名称
    #print(max(listdata))
    latestRecordData=max(listdata)
    Newlist = (list(set(listNameNew).difference(set(listName))))  # 实际,但是系统信息中没有,需要添加

    #通过判断最新时间来判断需要新增到Excel的追加列表
    for item in myfilelist:
        if((item[col_data]>latestRecordData) and item[col_name] not in listName):
            myFileSystem.append(item)
        elif((item[col_data]>latestRecordData) and item[col_name] in listName):
            index=listName.index(item[col_name])+1         #找到需要修改的行数,因为listName用了[1:]等于减去目录的一行,所以需要添加一行
            myFileSystem[index][col_data]=item[col_data]   #更新此行的文件修改时间
        elif((item[col_data]==latestRecordData) and item[col_name] not in listName): #重命名文件名是不修改文件时间的
            myFileSystem.append(item)
        elif((item[col_data]<latestRecordData) and item[col_name] in Newlist): #修复bug1
            myFileSystem.append(item)

    dellist=(list(set(listName).difference(set(listNameNew))))  #表格系统中有,但是实际文件中已经没有,需要删除
    for item in dellist:
        index = listName.index(item) + 1
        del myFileSystem[index]
'''
 * @description: 将list中的信息追加如Excel中
 * @param:path是Excel文件名称,value是要写入文件的所有数据
 * @return: 无
'''
def write_excel_append(path, value):
    index = len(value)  # 获取需要写入数据的行数
    workbook = xlrd.open_workbook(path)  # 打开工作簿
    sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
    worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
    rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
    for i in range(0, index):
        for j in range(0, len(value[i])):
            new_worksheet.write(i+rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
    new_workbook.save(path)  # 保存工作簿
    print("写入文件信息成功!")
'''
 * @description: 按关键字myTagSearchKeyWord搜索标签列,并且打印出对应文件的信息
 * @param:
 * @return: 无
'''
def mysearch():
    for item in myFileSystem:
        if(myTagSearchKeyWord in item[3]):
            print("搜索到第",myFileSystem.index(item),"行,文件信息为",item)

if __name__ == "__main__":
    lineNum=readExcel(excelfile) #读取表格中已有文件信息
    fileReader(file_dir) #通过扫描文件夹获取当前文件信息
    if(lineNum>1): #原来文件数据不为空,则需要处理
        fileHandler()
        UpdateExcel(excelfile,myFileSystem)
    elif(lineNum==0): #原来为空文件,直接追加读取的文件信息
        myhead=[("文件名","修改时间","标签","文件路径")]
        write_excel_append(excelfile,myhead)
        write_excel_append(excelfile, myfilelist)
    else: #原来文件包括标题
        write_excel_append(excelfile, myfilelist)
    #用于表格手工添加完标签后的关键字搜索附加功能,目前尚未开发完全
    mysearch()

'''
bug1(已修复):原来文件叫图3.txt,把它更新为名称图4.txt后再新建一个新的图3.txt,运行文件管理系统,图4.txt是识别不到的。
'''

运行效果:

1.png

删除了一个文件、添加了一个文件、修改了一个文件、重命名了一个文件后:


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