APP下载

基于Python+SQLite的文件整理软件设计与实现

2024-04-14李瑞洋周全兴

现代信息科技 2024年1期

李瑞洋 周全兴

DOI:10.19850/j.cnki.2096-4706.2024.01.006

收稿日期:2023-06-19

基金项目:凯里学院教学内容与课程体系改革项目(JG202110,JG202109);凯里学院做特市州高校专项计划项目(院办发〔2022〕10号-32);贵州省普通高等学校青年科技人才成长项目(黔教合KY字〔2020〕179,黔教合KY字〔2020〕180);貴州省科技计划项目(黔科合基础-ZK〔2023〕一般440)

摘  要:针对计算机中存储的文件日渐繁多,用于整理归纳的时间逐年上升的问题,采用Python中自带的os、date time、SQLite3、threading、hashlib和tkinter等数据库设计一款文件整理软件。该软件主要提供处理重复文件、提取目录下文件并重命名文件等功能。测试结果表明,该文件整理软件操作便捷,其整理效率远远高于传统整理方式,尤其是文件量大的情况下效果更明显。

关键词:Python;SQLite数据库;文件整理

中图分类号:TP311  文献标识码:A  文章编号:2096-4706(2024)01-0028-05

Design and Implementation of File Organizing Software Based on Python+SQLite

LI Ruiyang, ZHOU Quanxing

(School of Big Data Engineering, Kaili University, Kaili  556011, China)

Abstract: In response to the increasing number of files stored in computers and the increasing time required for organizing and summarizing, a file organizing software is designed using Python's built-in databases such as os, date time, SQLite3, threading, hashlib, and tkiner. This software mainly provides functions such as handling duplicate files, extracting files from directories, and renaming files. The test results show that the file organizing software is easy to operate, and its organizing efficiency is much higher than traditional organizing methods, especially when the file volume is large.

Keywords: Python; SQLite database; file organizing

0  引  言

在当今这个信息爆炸的时代[1],我们经常会遇到需要整理大量文件的情况,这些文件可能包括照片、文档、视频,等等。然而,由于不同来源的文件命名方式不同、保存路径不同,或者因为多次备份导致文件重复等问题,文件整理变得十分麻烦和耗时。针对这个问题,设计和实现了一款文件整理软件,该软件可以帮助用户快速和方便地处理重复文件、提取目录下所有子目录中的文件并复制到指定目录、按照时间戳来重命名文件等任务,以提高用户的工作效率和便利性。通过比较两款既存软件Duplicate Cleaner与Easy Duplicate Finder,我们发现他们存在一定缺点,如表1所示。相较以上两款软件,设计一款软件体积更小、不收费、界面简洁并能满足用户需求的软件非常有必要。据此,针对界面上繁杂的缺点,着重就以简洁的方式表达功能按键及使用的角度出发进行设计。

1  总体设计

1.1  功能需求分析与设计

计算机辅助档案实体整理中的问题:建立合理的文件实体分类方案、正确提取文件实体的属性信息、保持实体整理过程的连续性、做好每一个整理环节的质量控制[2]中所提及的概念在计算机仍然适用。电脑中的一个个文件也好比一个个文件实体,计算机文件中也存在属性信息。通过对文件整理类工具的调研,发现对程序化整理文件的需求主要体现为:筛选重复的文件、对文件从子目录中进行提取、对文件批量按照指定格式重命名这三个方面;但市面上往往有属于英文界面,汉化包少、功能繁杂,界面设计对用户不友好的缺陷。因此,包括以下功能的文件整理软件——《文件秘书》诞生,软件界面如图1所示。

1)删除重复文件:该功能主要可以删除任意目录下的重复文件,或者销毁整个文件夹,并在输入路径的根目录处留下文件索引。

2)移动文件:该功能可以将输入路径下所有子目录中的文件提取到指定目录下,使用时需要确保根目录处没有相同文件。

3)重命名文件:该功能可以根据文件属性中修改时间来重命名文件。

4)撤销操作:该功能可以根据查询前三个操作给出的记录表撤销操作。

1.2  开发语言环境与架构设计

程序基于Python的os[3]、datetime[4]、SQLite3[5]、threading[6]、hashlib[7]、tkinter[8]模块进行实现,分为操作界面于后台数据库储存两方面。操作界面主要采用tkinter库中的grid布局[9],以网格化结构对各空间排列安放,后台数据库采用SQLite数据库。

2  程序详细设计与实现

2.1  功能模块设计

程序由前端操作界面于后台数据库储存两方面构成。前端操作界面采用tk模块进行构造;后台数据库采用SQLite数据库,主要记录运行日志、历史操作、文件索引。

2.2  文件可视化界面设计

为了方便用户使用,设计了一个简单的文件可视化界面,以供用户进行文件整理操作。具体实现方式为:

1)主界面:在主界面上,采用grid方式网格化布局,界面从中间被一分为二,左侧是该程序的使用,右侧是有关该程序的信息(版本号、使用说明等)。

左侧的界面由一个输入框、快捷输入按钮、一个滑动条、一个勾选框以及四个按钮构成。其中,输入框及快捷输入按钮用于获取用户所期望处理的路径;滑动条及勾选框用于获取用户的指定需求,按钮用于用户确定并反馈程序让其执行。

2)各frame:frame被安放在主界面上,用于完善布局,使希望被统一布局的控件可以被一并布局,使界面更加美观。

2.3  目标对象输入

目标对象主要分为三个,有需要处理的目录路径、恢复先前操作的表名以及需要恢复的文件索引。

对需要处理的目录路径:我们主要采用两种方法获取,一个是由用户自行复制粘贴需要处理的目录路径;另一个是让用户点击我们设计并于输入框右侧放置的一个选项框,当用户点击了按钮buttonForAskDir后,其会调用tk中的filedialog.askdirectory方法。此时用户会看到一个系统自带的文件管理器的弹出界面,用户在该界面内选择即可获取文件路径。

2.4  执行指定操作

当用户点击相应按钮后,按钮会调用一个threading模块中Thread的方法,由其创造一个新的线程并且让实际执行的操作运行。本设计的主要目的是将执行的内容放到一个独立于窗口的线程中避免窗口出现“未响应”的异常。软件主要功能如图2所示。

其各操作细节为:

1)删除重复文件:在这个功能中,采用计算哈希值的方式来判断文件是否重复。Python中的hashlib库提供了简便的方式对文件进行哈希值的计算,只要通过hashlib.md5获得文件的md5值或通过hashlib.sha1获得文件的sha1值就能够获得文件的摘要信息,在不考虑撞库的情况下,用这种方法识别以及筛选出重复文件是可行的。简单来说,通过hashlib模块计算文件的md5和sha1哈希值来获取文件的唯一标识符,并将该标识符存储在一列表中用于比对是否存在。

在删除重复文件时,首先需要遍历整个目录树,并对每个文件进行哈希值计算和查找。如果发现某个文件已经存在于数据库中,则说明该文件是重复文件,可以删除。否则,将该文件的哈希值存储到数据库中,以便后续比较。

在销毁整个文件夹时,需要先建立数据库索引并将原有文件移动至回收站或md5库,再留下索引部分,以确保文件可以被恢复。

2)移动文件:在这个功能中,需要递归遍历输入路径下的所有子目录,并将每个文件移动到指定目录。该功能主要的实现方式是通过Python的os模块中的remove进行实现。

3)重命名文件:在这个功能中,主要是通过获取文件修改时间来重命名文件。由于不同操作系统对时间格式的定义可能会有所差异,因此需要通过time模块将时间戳转换为指定的时间格式,并将该格式与原有文件名拼接在一起,即可实现文件重命名,如图3、4所示。

其中,由于多处涉及文件时间获取,故写函数:

def getPathTime(path):  # 获取文件时间#以最后一次修改时间作为文件时间#gPT

taskBeginTime = time.time()

if not os.path.exists(path):

taskrecord(taskBeginTime, 'gPT-"not exist"')

return False

pathtime = os.stat(path).st_mtime

pathtime = str(turnTimeStampToFormatTime(pathtime)) + '-' + str(pathtime)

taskrecord(taskBeginTime, 'gPT')

return pathtime

2.5  数据库设计

本程序数据库采用SQLite数据库,主要记录:运行日志、处理过程、文件索引,由于建立文件索引时数据库路径与程序记录用数据库不同,故数据库连接对象不同,特写如下方法获得数据库对象:

def formatdatabase(databasepath):

# 创建连接对象

connectionobject = sqlite3.connect(databasepath+'.db', timeout=10, check_same_thread=False)

# 创建游标对象

cursorobject = connectionobject.cursor()

connectionobject.execute("create table if not exists 數据库访问log(开启时间 primary key,关闭时间,版本号)")

# 如果只插入一个元素要在其后面加逗号让它变元组

connectionobject.execute("insert into 数据库访问log(开启时间,版本号)values(?,?)",(time.time(), version))

connectionobject.execute("create table if not exists 错误log(错误时间 primary key,错误内容,错误时表名,错误时路径)")

connectionobject.execute("create table if not exists 任务、对应表名、点击位置log(任务开始时间 primary key,开启时间,任务内容,表名,x,y,任务结束时间)")

connectionobject.execute("create table if not exists 函数调用log(任务开始时间 primary key,开启时间,调用函数名,任务结束时间)")

connectionobject.execute("create table if not exists 输入log(任务开始时间 primary key,开启时间,输入内容)")

connectionobject.execute("create table if not exists 弹出窗log(提示时间 primary key,开启时间,弹出内容)")

connectionobject.execute("create table if not exists 移动log(移动时刻 primary key,原文件位置,现文件位置,异常)")

connectionobject.execute("create table if not exists 空文件夹清除log(清除时刻 primary key,被清除路径,异常)")

connectionobject.execute("create table if not exists 窗口鼠标位置log(存在时刻 primary key,x,y,异常)")

connectionobject.execute("create table if not exists 全局鼠標位置log(存在时刻 primary key,x,y,异常)")

connectionobject.commit()

return connectionobject,cursorobject

运行日志:于程序根目录下一“文件秘书的数据库.db”的数据库文件中通过多张表(数据库访问log、错误log、任务、对应表名、点击位置log、函数调用log、输入log、弹出窗log、移动log、空文件夹清除log、窗口鼠标位置log)记录程序运行中的各个方面的信息,以便于后续的监控、调试和优化,其中数据库访问log的实例如图5所示。

处理过程:于程序根目录下一“文件秘书的数据库.db”的数据库文件中通过以处理时间+处理路径形式命名的表中根据处理要求的不同以单个文件处理时间为主键、储存其余相关信息以供后续撤销需求。

文件索引:适用于处理重复文件中以保留索引形式处理选项。里面使用一表“以哈希分类法处理的文件指向”保存处理前后地址供后续恢复操作。

3  功能测试与效果分析

黑盒测试:我们经过对每个功能的测试,发现各功能均正常运行且无误,具体测试内容如表2所示。

测试用文件夹为C:\text,测试用文件夹内含有以下文件:C:/text/新建BMP图像.BMP、C:/text/新建Microsoft PowerPoint演示文稿-副本.pptx、C:/text/新建 Microsoft PowerPoint演示文稿.pptx、C:/text/新建Microsoft Word文档.docx、C:/text/新建文件夹、C:/text/新建文件夹/新建Microsoft PowerPoint演示文稿.pptx、C:/text/新建Microsoft Word文档.docx。

测试内容包括输入框输入、按钮“处理重复文件”“提取目录下文件”“重命名文件”“撤销操作”按钮、滑块滑动及勾选框选择。

综上,我们经过了多轮的功能测试,并对结果进行了分析和总结。测试结果表明,本文件整理软件确实可以快速和准确地处理重复文件、提取目录下所有子目录中的文件并复制到指定目录、按照时间戳来重命名文件等任务。同时,我们的界面设计简洁易用,用户可以方便地完成不同的操作。

4  结  论

本文介绍了一款基于Python语言和SQLite数据库的文件整理软件的设计和实现过程。该工具包括处理重复文件、提取目录文件、按照时间戳来重命名文件等功能,具有简单易用、灵活性强、运行效率高的特点。测试结果表明,该工具可以有效地提高用户的工作效率和便利性,适合需要整理大量文件的个人用户使用。未来随着人工智能和自动化技术的不断发展,文件整理软件将变得越来越智能和高效。

参考文献:

[1] 李路.信息爆炸与数据分类 [J].现代农业科技,2011(9):35+37.

[2] 张明和,薛惠芬,侯秀生.计算机辅助档案实体整理的几个关键问题 [J].中国科技信息,2010(4):174-175.

[3] os — Miscellaneous operating system interfaces [EB/OL].[2023-09-27].https://docs.python.org/3/library/os.html.

[4] datetime — Basic date and time types [EB/OL].[2023-09-27].https://docs.python.org/3/library/datetime.html.

[5] SQLite3 — DB-API 2.0 interface for SQLite databases [EB/OL].[2023-09-27].https://docs.python.org/3/library/SQLite3.html.

[6] threading — Thread-based parallelism [EB/OL].[2023-09-28].https://docs.python.org/3/library/threading.html.

[7] hashlib — Secure hashes and message digests [EB/OL].[2023-09-28].https://docs.python.org/3/library/hashlib.html.

[8] tkinter — Python interface to Tcl/Tk [EB/OL].[2023-09-20].https://docs.python.org/3/library/tkinter.html.

[9] tkinter的grid布局定位方式图示详解[EB/OL].[2023-09-20].https://blog.csdn.net/hyf64/article/details/121427887.

作者简介:李瑞洋(2004—),男,汉族,福建福州人,本科在读,主要研究方向:计算机科学与技术专业;通讯作者:周全兴(1987—),男,汉族,贵州绥阳人,副教授,学士,主要研究方向:数据分析、区块链技术。