李瑞洋 周全興
DOI:10.19850/j.cnki.2096-4706.2024.01.006
收稿日期:2023-06-19
基金項(xiàng)目:凱里學(xué)院教學(xué)內(nèi)容與課程體系改革項(xiàng)目(JG202110,JG202109);凱里學(xué)院做特市州高校專項(xiàng)計(jì)劃項(xiàng)目(院辦發(fā)〔2022〕10號(hào)-32);貴州省普通高等學(xué)校青年科技人才成長(zhǎng)項(xiàng)目(黔教合KY字〔2020〕179,黔教合KY字〔2020〕180);貴州省科技計(jì)劃項(xiàng)目(黔科合基礎(chǔ)-ZK〔2023〕一般440)
摘? 要:針對(duì)計(jì)算機(jī)中存儲(chǔ)的文件日漸繁多,用于整理歸納的時(shí)間逐年上升的問題,采用Python中自帶的os、date time、SQLite3、threading、hashlib和tkinter等數(shù)據(jù)庫(kù)設(shè)計(jì)一款文件整理軟件。該軟件主要提供處理重復(fù)文件、提取目錄下文件并重命名文件等功能。測(cè)試結(jié)果表明,該文件整理軟件操作便捷,其整理效率遠(yuǎn)遠(yuǎn)高于傳統(tǒng)整理方式,尤其是文件量大的情況下效果更明顯。
關(guān)鍵詞:Python;SQLite數(shù)據(jù)庫(kù);文件整理
中圖分類號(hào):TP311? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):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? 引? 言
在當(dāng)今這個(gè)信息爆炸的時(shí)代[1],我們經(jīng)常會(huì)遇到需要整理大量文件的情況,這些文件可能包括照片、文檔、視頻,等等。然而,由于不同來源的文件命名方式不同、保存路徑不同,或者因?yàn)槎啻蝹浞輰?dǎo)致文件重復(fù)等問題,文件整理變得十分麻煩和耗時(shí)。針對(duì)這個(gè)問題,設(shè)計(jì)和實(shí)現(xiàn)了一款文件整理軟件,該軟件可以幫助用戶快速和方便地處理重復(fù)文件、提取目錄下所有子目錄中的文件并復(fù)制到指定目錄、按照時(shí)間戳來重命名文件等任務(wù),以提高用戶的工作效率和便利性。通過比較兩款既存軟件Duplicate Cleaner與Easy Duplicate Finder,我們發(fā)現(xiàn)他們存在一定缺點(diǎn),如表1所示。相較以上兩款軟件,設(shè)計(jì)一款軟件體積更小、不收費(fèi)、界面簡(jiǎn)潔并能滿足用戶需求的軟件非常有必要。據(jù)此,針對(duì)界面上繁雜的缺點(diǎn),著重就以簡(jiǎn)潔的方式表達(dá)功能按鍵及使用的角度出發(fā)進(jìn)行設(shè)計(jì)。
1? 總體設(shè)計(jì)
1.1? 功能需求分析與設(shè)計(jì)
計(jì)算機(jī)輔助檔案實(shí)體整理中的問題:建立合理的文件實(shí)體分類方案、正確提取文件實(shí)體的屬性信息、保持實(shí)體整理過程的連續(xù)性、做好每一個(gè)整理環(huán)節(jié)的質(zhì)量控制[2]中所提及的概念在計(jì)算機(jī)仍然適用。電腦中的一個(gè)個(gè)文件也好比一個(gè)個(gè)文件實(shí)體,計(jì)算機(jī)文件中也存在屬性信息。通過對(duì)文件整理類工具的調(diào)研,發(fā)現(xiàn)對(duì)程序化整理文件的需求主要體現(xiàn)為:篩選重復(fù)的文件、對(duì)文件從子目錄中進(jìn)行提取、對(duì)文件批量按照指定格式重命名這三個(gè)方面;但市面上往往有屬于英文界面,漢化包少、功能繁雜,界面設(shè)計(jì)對(duì)用戶不友好的缺陷。因此,包括以下功能的文件整理軟件——《文件秘書》誕生,軟件界面如圖1所示。
1)刪除重復(fù)文件:該功能主要可以刪除任意目錄下的重復(fù)文件,或者銷毀整個(gè)文件夾,并在輸入路徑的根目錄處留下文件索引。
2)移動(dòng)文件:該功能可以將輸入路徑下所有子目錄中的文件提取到指定目錄下,使用時(shí)需要確保根目錄處沒有相同文件。
3)重命名文件:該功能可以根據(jù)文件屬性中修改時(shí)間來重命名文件。
4)撤銷操作:該功能可以根據(jù)查詢前三個(gè)操作給出的記錄表撤銷操作。
1.2? 開發(fā)語言環(huán)境與架構(gòu)設(shè)計(jì)
程序基于Python的os[3]、datetime[4]、SQLite3[5]、threading[6]、hashlib[7]、tkinter[8]模塊進(jìn)行實(shí)現(xiàn),分為操作界面于后臺(tái)數(shù)據(jù)庫(kù)儲(chǔ)存兩方面。操作界面主要采用tkinter庫(kù)中的grid布局[9],以網(wǎng)格化結(jié)構(gòu)對(duì)各空間排列安放,后臺(tái)數(shù)據(jù)庫(kù)采用SQLite數(shù)據(jù)庫(kù)。
2? 程序詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)
2.1? 功能模塊設(shè)計(jì)
程序由前端操作界面于后臺(tái)數(shù)據(jù)庫(kù)儲(chǔ)存兩方面構(gòu)成。前端操作界面采用tk模塊進(jìn)行構(gòu)造;后臺(tái)數(shù)據(jù)庫(kù)采用SQLite數(shù)據(jù)庫(kù),主要記錄運(yùn)行日志、歷史操作、文件索引。
2.2? 文件可視化界面設(shè)計(jì)
為了方便用戶使用,設(shè)計(jì)了一個(gè)簡(jiǎn)單的文件可視化界面,以供用戶進(jìn)行文件整理操作。具體實(shí)現(xiàn)方式為:
1)主界面:在主界面上,采用grid方式網(wǎng)格化布局,界面從中間被一分為二,左側(cè)是該程序的使用,右側(cè)是有關(guān)該程序的信息(版本號(hào)、使用說明等)。
左側(cè)的界面由一個(gè)輸入框、快捷輸入按鈕、一個(gè)滑動(dòng)條、一個(gè)勾選框以及四個(gè)按鈕構(gòu)成。其中,輸入框及快捷輸入按鈕用于獲取用戶所期望處理的路徑;滑動(dòng)條及勾選框用于獲取用戶的指定需求,按鈕用于用戶確定并反饋程序讓其執(zhí)行。
2)各frame:frame被安放在主界面上,用于完善布局,使希望被統(tǒng)一布局的控件可以被一并布局,使界面更加美觀。
2.3? 目標(biāo)對(duì)象輸入
目標(biāo)對(duì)象主要分為三個(gè),有需要處理的目錄路徑、恢復(fù)先前操作的表名以及需要恢復(fù)的文件索引。
對(duì)需要處理的目錄路徑:我們主要采用兩種方法獲取,一個(gè)是由用戶自行復(fù)制粘貼需要處理的目錄路徑;另一個(gè)是讓用戶點(diǎn)擊我們?cè)O(shè)計(jì)并于輸入框右側(cè)放置的一個(gè)選項(xiàng)框,當(dāng)用戶點(diǎn)擊了按鈕buttonForAskDir后,其會(huì)調(diào)用tk中的filedialog.askdirectory方法。此時(shí)用戶會(huì)看到一個(gè)系統(tǒng)自帶的文件管理器的彈出界面,用戶在該界面內(nèi)選擇即可獲取文件路徑。
2.4? 執(zhí)行指定操作
當(dāng)用戶點(diǎn)擊相應(yīng)按鈕后,按鈕會(huì)調(diào)用一個(gè)threading模塊中Thread的方法,由其創(chuàng)造一個(gè)新的線程并且讓實(shí)際執(zhí)行的操作運(yùn)行。本設(shè)計(jì)的主要目的是將執(zhí)行的內(nèi)容放到一個(gè)獨(dú)立于窗口的線程中避免窗口出現(xiàn)“未響應(yīng)”的異常。軟件主要功能如圖2所示。
其各操作細(xì)節(jié)為:
1)刪除重復(fù)文件:在這個(gè)功能中,采用計(jì)算哈希值的方式來判斷文件是否重復(fù)。Python中的hashlib庫(kù)提供了簡(jiǎn)便的方式對(duì)文件進(jìn)行哈希值的計(jì)算,只要通過hashlib.md5獲得文件的md5值或通過hashlib.sha1獲得文件的sha1值就能夠獲得文件的摘要信息,在不考慮撞庫(kù)的情況下,用這種方法識(shí)別以及篩選出重復(fù)文件是可行的。簡(jiǎn)單來說,通過hashlib模塊計(jì)算文件的md5和sha1哈希值來獲取文件的唯一標(biāo)識(shí)符,并將該標(biāo)識(shí)符存儲(chǔ)在一列表中用于比對(duì)是否存在。
在刪除重復(fù)文件時(shí),首先需要遍歷整個(gè)目錄樹,并對(duì)每個(gè)文件進(jìn)行哈希值計(jì)算和查找。如果發(fā)現(xiàn)某個(gè)文件已經(jīng)存在于數(shù)據(jù)庫(kù)中,則說明該文件是重復(fù)文件,可以刪除。否則,將該文件的哈希值存儲(chǔ)到數(shù)據(jù)庫(kù)中,以便后續(xù)比較。
在銷毀整個(gè)文件夾時(shí),需要先建立數(shù)據(jù)庫(kù)索引并將原有文件移動(dòng)至回收站或md5庫(kù),再留下索引部分,以確保文件可以被恢復(fù)。
2)移動(dòng)文件:在這個(gè)功能中,需要遞歸遍歷輸入路徑下的所有子目錄,并將每個(gè)文件移動(dòng)到指定目錄。該功能主要的實(shí)現(xiàn)方式是通過Python的os模塊中的remove進(jìn)行實(shí)現(xiàn)。
3)重命名文件:在這個(gè)功能中,主要是通過獲取文件修改時(shí)間來重命名文件。由于不同操作系統(tǒng)對(duì)時(shí)間格式的定義可能會(huì)有所差異,因此需要通過time模塊將時(shí)間戳轉(zhuǎn)換為指定的時(shí)間格式,并將該格式與原有文件名拼接在一起,即可實(shí)現(xiàn)文件重命名,如圖3、4所示。
其中,由于多處涉及文件時(shí)間獲取,故寫函數(shù):
def getPathTime(path):? # 獲取文件時(shí)間#以最后一次修改時(shí)間作為文件時(shí)間#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? 數(shù)據(jù)庫(kù)設(shè)計(jì)
本程序數(shù)據(jù)庫(kù)采用SQLite數(shù)據(jù)庫(kù),主要記錄:運(yùn)行日志、處理過程、文件索引,由于建立文件索引時(shí)數(shù)據(jù)庫(kù)路徑與程序記錄用數(shù)據(jù)庫(kù)不同,故數(shù)據(jù)庫(kù)連接對(duì)象不同,特寫如下方法獲得數(shù)據(jù)庫(kù)對(duì)象:
def formatdatabase(databasepath):
# 創(chuàng)建連接對(duì)象
connectionobject = sqlite3.connect(databasepath+'.db', timeout=10, check_same_thread=False)
# 創(chuàng)建游標(biāo)對(duì)象
cursorobject = connectionobject.cursor()
connectionobject.execute("create table if not exists 數(shù)據(jù)庫(kù)訪問log(開啟時(shí)間 primary key,關(guān)閉時(shí)間,版本號(hào))")
# 如果只插入一個(gè)元素要在其后面加逗號(hào)讓它變?cè)M
connectionobject.execute("insert into 數(shù)據(jù)庫(kù)訪問log(開啟時(shí)間,版本號(hào))values(?,?)",(time.time(), version))
connectionobject.execute("create table if not exists 錯(cuò)誤log(錯(cuò)誤時(shí)間 primary key,錯(cuò)誤內(nèi)容,錯(cuò)誤時(shí)表名,錯(cuò)誤時(shí)路徑)")
connectionobject.execute("create table if not exists 任務(wù)、對(duì)應(yīng)表名、點(diǎn)擊位置log(任務(wù)開始時(shí)間 primary key,開啟時(shí)間,任務(wù)內(nèi)容,表名,x,y,任務(wù)結(jié)束時(shí)間)")
connectionobject.execute("create table if not exists 函數(shù)調(diào)用log(任務(wù)開始時(shí)間 primary key,開啟時(shí)間,調(diào)用函數(shù)名,任務(wù)結(jié)束時(shí)間)")
connectionobject.execute("create table if not exists 輸入log(任務(wù)開始時(shí)間 primary key,開啟時(shí)間,輸入內(nèi)容)")
connectionobject.execute("create table if not exists 彈出窗l(fā)og(提示時(shí)間 primary key,開啟時(shí)間,彈出內(nèi)容)")
connectionobject.execute("create table if not exists 移動(dòng)log(移動(dòng)時(shí)刻 primary key,原文件位置,現(xiàn)文件位置,異常)")
connectionobject.execute("create table if not exists 空文件夾清除log(清除時(shí)刻 primary key,被清除路徑,異常)")
connectionobject.execute("create table if not exists 窗口鼠標(biāo)位置log(存在時(shí)刻 primary key,x,y,異常)")
connectionobject.execute("create table if not exists 全局鼠標(biāo)位置log(存在時(shí)刻 primary key,x,y,異常)")
connectionobject.commit()
return connectionobject,cursorobject
運(yùn)行日志:于程序根目錄下一“文件秘書的數(shù)據(jù)庫(kù).db”的數(shù)據(jù)庫(kù)文件中通過多張表(數(shù)據(jù)庫(kù)訪問log、錯(cuò)誤log、任務(wù)、對(duì)應(yīng)表名、點(diǎn)擊位置log、函數(shù)調(diào)用log、輸入log、彈出窗l(fā)og、移動(dòng)log、空文件夾清除log、窗口鼠標(biāo)位置log)記錄程序運(yùn)行中的各個(gè)方面的信息,以便于后續(xù)的監(jiān)控、調(diào)試和優(yōu)化,其中數(shù)據(jù)庫(kù)訪問log的實(shí)例如圖5所示。
處理過程:于程序根目錄下一“文件秘書的數(shù)據(jù)庫(kù).db”的數(shù)據(jù)庫(kù)文件中通過以處理時(shí)間+處理路徑形式命名的表中根據(jù)處理要求的不同以單個(gè)文件處理時(shí)間為主鍵、儲(chǔ)存其余相關(guān)信息以供后續(xù)撤銷需求。
文件索引:適用于處理重復(fù)文件中以保留索引形式處理選項(xiàng)。里面使用一表“以哈希分類法處理的文件指向”保存處理前后地址供后續(xù)恢復(fù)操作。
3? 功能測(cè)試與效果分析
黑盒測(cè)試:我們經(jīng)過對(duì)每個(gè)功能的測(cè)試,發(fā)現(xiàn)各功能均正常運(yùn)行且無誤,具體測(cè)試內(nèi)容如表2所示。
測(cè)試用文件夾為C:\text,測(cè)試用文件夾內(nèi)含有以下文件: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。
測(cè)試內(nèi)容包括輸入框輸入、按鈕“處理重復(fù)文件”“提取目錄下文件”“重命名文件”“撤銷操作”按鈕、滑塊滑動(dòng)及勾選框選擇。
綜上,我們經(jīng)過了多輪的功能測(cè)試,并對(duì)結(jié)果進(jìn)行了分析和總結(jié)。測(cè)試結(jié)果表明,本文件整理軟件確實(shí)可以快速和準(zhǔn)確地處理重復(fù)文件、提取目錄下所有子目錄中的文件并復(fù)制到指定目錄、按照時(shí)間戳來重命名文件等任務(wù)。同時(shí),我們的界面設(shè)計(jì)簡(jiǎn)潔易用,用戶可以方便地完成不同的操作。
4? 結(jié)? 論
本文介紹了一款基于Python語言和SQLite數(shù)據(jù)庫(kù)的文件整理軟件的設(shè)計(jì)和實(shí)現(xiàn)過程。該工具包括處理重復(fù)文件、提取目錄文件、按照時(shí)間戳來重命名文件等功能,具有簡(jiǎn)單易用、靈活性強(qiáng)、運(yùn)行效率高的特點(diǎn)。測(cè)試結(jié)果表明,該工具可以有效地提高用戶的工作效率和便利性,適合需要整理大量文件的個(gè)人用戶使用。未來隨著人工智能和自動(dòng)化技術(shù)的不斷發(fā)展,文件整理軟件將變得越來越智能和高效。
參考文獻(xiàn):
[1] 李路.信息爆炸與數(shù)據(jù)分類 [J].現(xiàn)代農(nóng)業(yè)科技,2011(9):35+37.
[2] 張明和,薛惠芬,侯秀生.計(jì)算機(jī)輔助檔案實(shí)體整理的幾個(gè)關(guān)鍵問題 [J].中國(guó)科技信息,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.
作者簡(jiǎn)介:李瑞洋(2004—),男,漢族,福建福州人,本科在讀,主要研究方向:計(jì)算機(jī)科學(xué)與技術(shù)專業(yè);通訊作者:周全興(1987—),男,漢族,貴州綏陽人,副教授,學(xué)士,主要研究方向:數(shù)據(jù)分析、區(qū)塊鏈技術(shù)。