使用zipfile庫,python自帶的,不需要另外安裝
zip壓縮格式是開源的,rar格式是商業的,這里只說解壓縮zip格式
程序是通過密碼字典,暴力破解zip壓縮文件
解壓縮zip文件的核心代碼如下:
# 打開Zip文件
zFile = zipfile.ZipFile(filepath, mode='r')
# 解壓到軟件所在目錄
# 此處無論密碼是否正確都會創建目錄
# 如果密碼錯誤則會報異常
# 此方法中文亂碼
zFile.extractall(pwd=bytes(password, 'utf-8'), path=folder)
代碼解釋:
filepath,zip壓縮文件
password,密碼
folder,目標目錄
遇到的問題
1,中文亂碼
網上找到的思路都是使用 extract() 逐個文件解壓,這樣就可以在此過程中逐個文件修正中文亂碼問題。
親測無效。
有效的思路是:
先用 extractall() 一次性解壓全部;
再遍歷文件夾和文件名,處理中文亂碼問題
處理中文亂碼的核心代碼如下:
# 處理中文亂碼
# os.walk() 是一個深度優先遍歷算法
# topdown = False 優先遍歷最底層的子目錄
for dirpath, dirnames, filenames in os.walk(folder, topdown=False):
# 遍歷目錄中所有文件,并重命名
# 必須先重命名文件名,如果先重命名文件夾,則文件名路徑錯誤
for filename in filenames:
newFilename = filename.encode('cp437').decode('gbk')
os.rename(os.path.join(dirpath, filename), os.path.join(dirpath, newFilename))
# 遍歷目錄中所有文件夾,并重命名
for dirname in dirnames:
newDirname = dirname.encode('cp437').decode('gbk')
os.rename(os.path.join(dirpath,
2,密碼錯誤也會創建目標文件夾
處理方法就是,如果密碼錯誤,未能正確解壓zip文件,則刪除空的目標文件夾
刪除目錄的核心代碼如下:
# 刪除無效目錄(解壓失敗也會產生目錄)
if os.path.exists(folder):
# 刪除目錄
shutil.rmtree(folde)
3,使用線程時出的問題
如果壓縮包中第一個文件名無后綴名,例如:.DS_Store
則采用多線程嘗試密碼時會報錯:
FileExistsError(17, '當文件已存在時,無法創建該文件。')
不使用多線程則不會報錯
所以可做成手動選擇多線程或單線程
手動選擇多線程或單線程的核心代碼如下:
for line in passFile.readlines():
password = line.strip('\n')
if isMultithreading:
# 多線程
t = Thread(target=extractZipFile, args=(zFile, password, folder))
t.start()
else:
# 單線程
extractZipFile(zFile, pass
代碼解釋:
passFile,是密碼文件,通過for循環逐個嘗試密碼
isMultithreading,是否使用多線程的標記
程序界面圖
界面.JPG
累死了~~~