Python 怒解 RAR
本文轉載自微信公眾號「Python七號」,作者somenzz。轉載本文請聯系Python七號公眾號。
MacOS 可以直接解壓 zip 文件,但 rar 文件卻需要下載軟件,于是我用了解優,過了段時間提示我需要付費才能用。
我按耐不住,這么簡單的需求,你讓我付費,我大 Python 是吃素的嘛,一頓操作,5 分鐘實現怒解 RAR 文件,以下是詳細方法:
1、下載源碼,編譯 lib
從這里下載源碼 https://www.rarlab.com/rar/unrarsrc-6.0.7.tar.gz
下載后,進入 unrar 目錄,執行 make lib 編譯,編譯完成后,會在 unrar 目錄會出現一個 libunrar.so 的動態鏈接庫文件,記錄這個 libunrar.so 路徑。
2、編寫代碼,怒解 RAR
這里需要先設置下環境變量 UNRAR_LIB_PATH,設置成上步我們生成 libunrar.so 的路徑,然后再導入 unrar 的 rarfile 模塊時,UNRAR_LIB_PATH 的值就不是 None 了。
使用 unrar 前,請先 pip install unrar 一下。
- import os
- os.environ.setdefault("UNRAR_LIB_PATH","/Users/aaron/Downloads/unsplash/unrar/libunrar.so")
- from unrar import rarfile
- target_path = '/Users/aaron/Downloads/unsplash'
- rf = rarfile.RarFile("/Users/aaron/Downloads/unsplash/python自動化運維.rar", mode='r') # mode的值只能為'r'
- rf_list = rf.namelist() # 得到壓縮包里所有的文件
- print('rar文件內容:')
- for file in rf_list:
- print(file)
- rf.extractall(target_path)
- print("解壓完成")
3、讓它更通用
上述代碼雖然能用,但每次使用需要復制路徑和文件名,不方便,這里我們把它做成一個命令行工具,代碼修改如下:
- #!/Users/aaron/py38env/bin/python3
- # -*- coding: utf-8 -*-
- import os
- os.environ.setdefault("UNRAR_LIB_PATH","/Users/aaron/Downloads/unsplash/unrar/libunrar.so")
- import sys
- from somedecorators import timeit
- from unrar import rarfile
- @timeit()
- def decompress(rar_file):
- rf = rarfile.RarFile(rar_file, mode='r') # mode的值只能為'r'
- rf_list = rf.namelist() # 得到壓縮包里所有的文件
- for file in rf_list:
- print(file)
- rf.extractall()
- if __name__ == '__main__':
- decompress(sys.argv[1])
文件第一行,指定了編譯器為 #!/Users/aaron/py38env/bin/python3,這樣在命令行執行時就不需要再敲 python 了。
函數上面使用了自己寫的裝飾器 somedecorators.timeit,只是為了統計時間,你可以 pip install somedecorators 來使用。
將上述代碼保存為 unrarfile,然后復制到 /Users/aaron/py38env/bin/ 目錄,不放這個目錄也行,只要放在 $PATH 目錄就可以在任意路徑下調用。先加上用戶可執行權限,再使用:
- chmod u+x /Users/aaron/py38env/bin/unrarfile
然后隨便找個 rar 文件,就可以執行 unrarfile rar文件名 進行解壓了:
- (py38env) ➜ tmp unrarfile myCeleryProj.rar
- myCeleryProj/.app.py.un~
- myCeleryProj/app.py
- myCeleryProj/settings.py
- myCeleryProj/tasks.py
- myCeleryProj/__init__.py
- myCeleryProj/__pycache__/celery.cpython-36.pyc
- myCeleryProj/__pycache__/celeryconfig.cpython-36.pyc
- myCeleryProj/__pycache__/tasks.cpython-36.pyc
- myCeleryProj/__pycache__/__init__.cpython-36.pyc
- myCeleryProj/__pycache__
- myCeleryProj
- decompress cost 0.0070 seconds
- (py38env) ➜ tmp
是不是很方便?
最后的話
很多問題,只要會重復遇到,就要想辦法徹底解決,否則,在某個未知時刻,這個問題還會出來煩人,Python 就是解決這類重復問題的利器。