leetcode 解压缩_谁说 Python 的 shutil 不支持 7z 解压缩,我来教你扩展它的功能!...
Python 的內(nèi)置模塊
在 Python 的標(biāo)準(zhǔn)庫中,有哪些你常用并且覺得犀利無比的模塊?
不要說 time、datetime、os、sys,這些模塊常用是常用,但是逼格不夠高啊。
舉個例子,如果你經(jīng)常在 LeetCode 上刷題,你會發(fā)現(xiàn)有時 Java、C 需要幾十行的算法題,如果 Python 使用了?collections、itertools,可能只需要 3、4 代碼就完成了!
shutil 的便利
日常的編碼中,常會涉及到對文件、目錄等的操作場景,如果我們使用 os,可能需要對文件、文件夾,非空等進(jìn)行逐個判斷。
舉個例子: 我們現(xiàn)在要刪除一個目錄,目錄中包含有文件與文件夾,如果使用 os 模塊,沒有現(xiàn)成可以使用的函數(shù),需要我們進(jìn)行判斷與分類執(zhí)行。
import?os
#?path是文件的路徑,如果這個路徑是一個文件夾,
#?則會拋出OSError的錯誤,這時需用用rmdir()來刪除
os.remove(path)
# path是文件夾路徑,注意文件夾需空的才能被刪除
os.rmdir(path)
多數(shù)初學(xué)者遇到刪除文件夾,想到的操作就是,創(chuàng)建兩個列表,然后用 os.walk 遍歷目錄,將文件與文件夾分別存入初始化的兩個列表中,然后先統(tǒng)一刪除文件,最后刪除文件夾。
如果有上面這樣操作的同學(xué),請面壁三分鐘。明顯沒有好好學(xué)習(xí) os.walk 函數(shù)
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) top -- 是你所要遍歷的目錄的地址, 返回的是一個三元組(root,dirs,files)。
- root 所指的是當(dāng)前正在遍歷的這個文件夾的本身的地址
- dirs 是一個 list ,內(nèi)容是該文件夾中所有的目錄的名字(不包括子目錄)
- files 同樣是 list , 內(nèi)容是該文件夾中所有的文件(不包括子目錄)
topdown --可選,為 True,則優(yōu)先遍歷 top 目錄,否則優(yōu)先遍歷 top 的子目錄(默認(rèn)為開啟)。如果 topdown 參數(shù)為 True,walk 會遍歷top文件夾,與top 文件夾中每一個子目錄。
onerror -- 可選,需要一個 callable 對象,當(dāng) walk 需要異常時,會調(diào)用。
followlinks -- 可選,如果為 True,則會遍歷目錄下的快捷方式(linux 下是軟連接 symbolic link )實(shí)際所指的目錄(默認(rèn)關(guān)閉),如果為 False,則優(yōu)先遍歷 top 的子目錄。
只需要將 topdown 設(shè)置為 False,這樣在遍歷目錄時,就會從根節(jié)點(diǎn)進(jìn)行遍歷,然后我們逐個刪除就 ok 了,哪里需要那么麻煩!
代碼如下:
import?os
for?root,?dirs,?files?in?os.walk('D:\\software_temp',?topdown=False):
????for?name?in?files:
????????os.remove(os.path.join(root,?name))
????for?name?in?dirs:
????????os.rmdir(os.path.join(root,?name))
說這么多,無外乎為了引出最簡便的方式 : shutil 模塊
如果換做 shutil 模塊登場,那么執(zhí)行刪除目錄的操作,只需要 0.1 秒的時間
import?shutil
shutil.rmtree('D:\\software_temp')
就這樣,完事兒了...
文件解壓縮
日常工作中,我們經(jīng)常會使用 Python 進(jìn)行文件的解壓縮處理。
Python 自帶的解壓縮模塊有 zipfile, gzip, tarfile,如果我們需要解壓 rar 文件則需要單獨(dú)下載 rarfile 模塊,針對每一種壓縮文件,我們都需要針對文件類型進(jìn)行對應(yīng)模塊的使用
是不是很繁瑣?如果我們使用 shutil 呢?讓我們先來看看 shutil 支持的解壓類型:
import?pprint
import?shutil
pprint.pprint(shutil.get_unpack_formats())
output:
[('bztar',?['.tar.bz2',?'.tbz2'],?"bzip2'ed?tar-file"),
?('gztar',?['.tar.gz',?'.tgz'],?"gzip'ed?tar-file"),
?('tar',?['.tar'],?'uncompressed?tar?file'),
?('xztar',?['.tar.xz',?'.txz'],?"xz'ed?tar-file"),
?('zip',?['.zip'],?'ZIP?file')]
shutil 已經(jīng)包含了我們上面提到的所有文件。
.7z 文件是什么鬼?
眾所周知,zip 的壓縮率相比 rar 是比較低的,但是商業(yè)軟件下載中,你很少會見到 .rar 的文件,why?因?yàn)閷@?..
RAR是一種專利文件格式,用于數(shù)據(jù)壓縮與歸檔打包,開發(fā)者為尤金·羅謝爾(俄語:Евгений Лазаревич Рошал,拉丁轉(zhuǎn)寫:Yevgeny Lazarevich Roshal),RAR的全名是“Roshal ARchive”,即“羅謝爾的歸檔”之意。首個公開版本RAR 1.3發(fā)布于1993年。
所以,有很多產(chǎn)品在軟件發(fā)布時,開始使用一種壓縮率更高的 .7z 文件,這又是為什么?
7-zip 官方主頁:
https://sparanoid.com/lab/7z/
在其中有一個許可協(xié)議是這樣寫的
許可協(xié)議:
7-Zip 是一款 開源 軟件。大多數(shù)源代碼都基于 GNU LGPL 許可協(xié)議下發(fā)布。AES 代碼基于 BSD 許可下發(fā)布。unRAR 代碼基于兩種許可:GNU LGPL 和 unRAR 限制許可。更多下許可信息請查看:7-Zip 許可。您可以在任何一臺計(jì)算機(jī)上使用 7-Zip ,包括用在商業(yè)用途的計(jì)算機(jī),不對 7-Zip 進(jìn)行捐贈或支付并不影響您的使用。
shutil 擴(kuò)展 7z
說了這么多 7z 文件的好處,可我們看到shutil并不能解壓該類型的文件啊。
我們能否讓 shutil 支持 .7z 文件,達(dá)到無腦解壓縮呢?
此時,你需要?py7zr?模塊,養(yǎng)成好習(xí)慣,遇到模塊先找 GitHub
https://github.com/miurahr/py7zr
1. 模塊下載
pip install py7zr
2. 基本使用
當(dāng)我們安裝好 py7zr 后,它可以在 cmd 下直接運(yùn)行該命令
List?archive?contents
$?py7zr?l?test.7z
Extract?archive
$?py7zr?x?test.7z
Extract?archive?with?password
$?py7zr?x?-P?test.7z
??password?:?****
Create?and?compress?to?archive
$?py7zr?c?target.7z?test_dir
Create?multi-volume?archive
$?py7zr?c?-v?500k?target.7z?test_dir
Test?archive
$?py7zr?t?test.7z
Show?information
$?py7zr?i
Show?version
$?py7zr?--version
單獨(dú)使用模塊
import?py7zr
archive?=?py7zr.SevenZipFile('sample.7z',?mode='r')
archive.extractall(path="/tmp")
archive.close()
with?py7zr.SevenZipFile('target.7z',?'w')?as?z:
????z.writeall('./base_dir')
3. shutil 集成
之所以推薦 py7zr 給大家,不僅因?yàn)樗暮唵魏糜?#xff0c;更是由于他可以輕松集成于 shutil,來看看它的使用方式吧:
from?py7zr?import?pack_7zarchvie,?unpack_7zarchive
import?shutil
#?register?file?format?at?first.
shutil.register_archive_format('7zip',
???????????????????????????????pack_7zarchive,
???????????????????????????????description='7zip?archive')
shutil.register_unpack_format('7zip',
??????????????????????????????['.7z'],
??????????????????????????????unpack_7zarchive,
??????????????????????????????description='7zip?archive')
#?extraction
shutil.unpack_archive('test.7z',?'/tmp')
#?compression
shutil.make_archive('target',?'7zip',?'src')
pprint.pprint(shutil.get_unpack_formats())
#?output:
[('7zip',?['.7z'],?'7zip?archive'),
?('bztar',?['.tar.bz2',?'.tbz2'],?"bzip2'ed?tar-file"),
?('gztar',?['.tar.gz',?'.tgz'],?"gzip'ed?tar-file"),
?('tar',?['.tar'],?'uncompressed?tar?file'),
?('xztar',?['.tar.xz',?'.txz'],?"xz'ed?tar-file"),
?('zip',?['.zip'],?'ZIP?file')]
通過注冊我們看到,shutil 已經(jīng)支持 7z 文件的解壓了,就是如此簡單
總結(jié)
以上是生活随笔為你收集整理的leetcode 解压缩_谁说 Python 的 shutil 不支持 7z 解压缩,我来教你扩展它的功能!...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电影美人鱼中张轩是不是太监
- 下一篇: 上海欢乐谷最晚什么时候关门