這又是一篇用Python寫小軟體系列,最近有點寫上癮了,檔案壓縮和解壓我們在日常工作學習中會經常用到,比如winrar、快壓、好壓等壓縮軟體,猿人學用Python做個簡易圖形介面的壓縮軟體。
開啟之後的介面長這個樣子:
壓縮完成後是這個樣子:
解壓完成後是這個樣子:
看到這個介面,閱讀過猿人學之前文章《給寶寶的翻譯小軟體(續):支援PDF啦!》的老朋友應該能認出來,這是在那個翻譯軟體的GUI介面上修改的,哈哈。
Python壓縮軟體程式實現和分析過程
首先不像商業壓縮軟體,我把功能簡化了很多,只實現主要的壓縮(壓縮檔案和資料夾)和解壓功能。
Python有一些第三方壓縮和解壓的庫,我選用了zipfile,把檔案壓縮為.zip,圖形化選用了pyqt5,因為之前翻譯軟體實現過圖形化,所以就偷懶拿過來改一下用。
程式的執行流程是(對照上面的圖看):
首先在下拉框選擇是“壓縮”還是“解壓”,然後點選“選擇“按鈕選擇要執行的檔案,選擇完成後點選右下角的“開始”按鈕,軟體就開始執行了。
整個過程比較簡單,主要兩個地方卡殼了一下,耗了點時間去解決。
Python壓縮程式第一個卡殼地方是:
因為要實現壓縮檔案和資料夾的功能,所以當點選圖形介面的”選擇“按鈕時要支援既能選擇檔案,又能選擇資料夾。
但是Qt的QFileDialog不支援這樣的實現,提供的控制元件要麼只能選檔案,要麼只能選資料夾,對此花了好幾個小時去研究和查閱資料,得出的結論是要繼承QFileDialog類,然後重寫這個類的部分方法來,實現既能選檔案又能選資料夾的功能,於是趟坑去實現了一把,對Qt本身的機制也是一知半解,所以除錯了很久。
重新實現的QFileDialog類程式碼如下:
class FileDialog(QtWidgets.QFileDialog):
def __init__(self, *args, **kwargs):
super(FileDialog, self).__init__(*args, **kwargs)
self.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
self.setFileMode(QtWidgets.QFileDialog.ExistingFiles)
self.tree = self.findChild(QtWidgets.QTreeView)
self._selFile = ''
def accept(self):
inds = self.tree.selectionModel().selectedIndexes()
self._selFile = os.path.join(str(self.directory().absolutePath()),str(inds[0].data()))
print('_selfile:',self._selFile)
self.hide()
def selectedFiles(self):
return self._selFile
第二個Pyhthon壓縮程式卡殼的地方是:
我把整個程式都寫完了,測試了幾把沒有問題,自己沾沾自喜這個程式真完美。第二天又想起了,想再完整的測試一下,畢竟要寫在猿人學公眾號上,被人挑刺心裡總是不好受的。結果發現壓縮時會把你的整個檔案路徑上的資料夾都壓縮排去。
舉個例子:
比如要壓縮的檔案路徑是:D:/log/nginx/access.log
壓縮是:D:/log/nginx/access.zip
解壓後,正常情況應該是把檔案還原為:
D:/log/nginx/access/access.log
但是實際上解壓後變成了:
D:/log/nginx/access/log/nginx/access.log
就是程式在壓縮的時候把檔案路徑上的目錄也都壓縮排去了。
這也除錯了好一會,開始以為是把檔案路徑給傳錯了。
結果是自己對zipfile的使用沒研究清楚,錯誤示例如下:
z = zipfile.Zipfile('D:/log/nginx/access.zip')
z.write('D:/log/nginx/access.log')
z.close()
這樣就會把檔案路徑上的目錄全都壓縮排去。正確的用法是:
z = zipfile.Zipfile('D:/log/nginx/access.zip')
z.write('D:/log/nginx/access.log','access.log')
z.close()
為什麼頭一天測試沒有發現這個問題呢?
因為我之前測試要壓縮的檔案路徑是這樣的:D:/access.log
檔案在根目錄下面,檔案路徑上沒有其他目錄了,所以就發現不了。
這也告訴我們測試一定要多角度,多場景測試啊。
兩個Python原始檔,200多行程式碼搞定,再一次感嘆用Python就是方便。
把Python壓縮程式打包成exe檔案
一樣可以使用pyinstaller把程式打包成exe檔案,就可以把exe檔案發給其他朋友使用了,他們的電腦沒有Python開發環境也能執行此程式,當然為了程式穩定,你最好多在幾臺電腦上測試一下。
打包命令:
pyinstaller -F -w -i icon.ico transdocx.py
Python壓縮程式檔案結構:
一個zip_main.py檔案(圖形介面),一個zip_console.py檔案(壓縮功能),開發圖形介面程式通常是這樣,把圖形介面部分和業務功能部分要分離,相互不干擾,也方便以後修改。
程式執行方法:python zip_main.py
Python壓縮程式不足之處
1.這個程式只能壓縮和解壓zip檔案,不支援rar、tar。
2.沒有嚴格的容錯處理
3.不支援加密壓縮和解壓
還是一樣,猿人學Python公眾號後臺回覆:壓縮 獲得原始碼。
Python小軟體系列閱讀:
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***