博主在前兩篇博文分別介紹了加密RAR檔案的解壓https://www.cnblogs.com/kangbazi666/p/13646308.html和加密ZIP檔案的解壓https://www.cnblogs.com/kangbazi666/p/13666783.html,后面又開始嘗試了兩類檔案的加密壓縮,在查閱相關資料后,發現rarfile庫和zipfile庫都不支持加密壓縮,只能實作普通壓縮,因此另謀他路,發現可以呼叫CMD命令進行壓縮,下面將分別介紹RAR和ZIP檔案的加密壓縮,
呼叫壓縮成RAR的CMD命令為:
C:\"Program Files"\WinRAR\WinRAR.exe a -p123 C:\test.rar C:\test.txt
命令引數解釋:第一個引數為WinRAR軟體的安裝路徑,第二個引數a表示添加壓縮,第三個引數用于設定壓縮密碼,-p加上密碼“123”,第四個引數為壓縮檔案的輸出路徑及其壓縮的檔案名,第五個引數為需要壓縮的檔案路徑,如果是單個檔案需要具體到檔案名,如果是檔案夾下所有檔案,只需到當前檔案夾路徑,
呼叫壓縮成ZIP的CMD命令同RAR,只是輸出路徑不同,需將后綴改為.zip:
C:\"Program Files"\WinRAR\WinRAR.exe a -p123 C:\test.zip C:\test.txt
因此首先需要在電腦上安裝WinRAR檔案,下載鏈接為:http://www.winrar.com.cn/download.htm ,官網最新版本的WInRAR軟體加密方式AES-256加密,如果需要CRC32加密,也即傳統加密方式,可以下載WinRAR5.4版本,博主的百度網盤分享鏈接:https://pan.baidu.com/s/1IyC9TKJ4E8LmMBZAN2kGXw 提取碼:dgkt
在弄清CMD命令后,利用Python實作就很容易了,有兩種實作方式:
(1)os.system
(2)subprocess.Popen
博主采用了os模塊的system實作,下面分別介紹RAR和ZIP的加密壓縮實作:
(1)RAR加密壓縮:
1 import os
2 password = "123"
3 dirpath = "C:\test.txt"#待壓縮的檔案路徑及檔案
4 outFullName = "C:\test.rar"#壓縮檔案的輸出路徑及檔案名
5 cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s %s %s' % (password, outFullName, dirpath)#password為壓縮密碼
6 os.system(cmd)
如果上面的代碼呼叫的WinRAR為比較新的版本,加密方式即為AES-256加密,如果你想要實作傳統加密,有兩種方法實作:(1)安裝前面介紹的WinRAR5.4版本;(2)可以在命令列中添加一個引數:-mezl

代碼實作也即將第5行修改為:
cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s -mezl %s %s' % (password, outFullName, dirpath)
(2)ZIP加密壓縮:
代碼同RAR加密壓縮,只需修改第4行中的壓縮檔案的輸出名為.zip即可
import os
password = "123"
dirpath = "C:\test.txt"#待壓縮的檔案路徑及檔案
outFullName = "C:\test.zip"#壓縮檔案的輸出路徑及檔案名
cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s %s %s' % (password, outFullName, dirpath)#password為壓縮密碼
os.system(cmd)
博主在實作程序中測驗密碼的時候發現,CMD命令中也存在特殊字符的轉義問題,例如博主在測驗的密碼中帶有雙引號時,轉義遇到了很大的麻煩,因為Python和CMD中都需要對雙引號進行轉義,在查詢很大資料,嘗試了"" /符號進行轉義都無果,最后進行大量嘗試,發現了CMD中兩種方式能對雙引號進行轉義,(博主的密碼為“123):
(1)雙引號用兩個雙引號引起來,最后再加一個雙引號,此時壓縮密碼是“123
![]()
(2)雙引號前面再加一個雙引號,此時壓縮密碼仍然是“123
![]()
因此博主在代碼上考慮了引號:
import os
def Rar():
cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s -mezl %s %s' % (password, outFullName, dirpath)
print(cmd)
if __name__ == "__main__":
dirpath = "C:\\Test"
outFullName = "C:\\test.rar"
pwd = input("密碼")
i = '"'if i in pwd:
password = pwd.replace('"','""')
print(password)
else:
password = pwd
Rar()
當然CMD中還有/等符號的轉義,還有空格符號的一些處理,有興趣的朋友都可以去了解一下,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/37677.html
標籤:Python
上一篇:為什么程式全速運行時不進入訊息處理函式,設定斷點后又能進入訊息處理函式呢?
下一篇:包裹繼承問題
