日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

leetcode 解压缩_谁说 Python 的 shutil 不支持 7z 解压缩,我来教你扩展它的功能!...

發(fā)布時(shí)間:2023/11/27 生活经验 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 解压缩_谁说 Python 的 shutil 不支持 7z 解压缩,我来教你扩展它的功能!... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python 的內(nèi)置模塊

在 Python 的標(biāo)準(zhǔn)庫(kù)中,有哪些你常用并且覺得犀利無(wú)比的模塊?

不要說(shuō) time、datetime、os、sys,這些模塊常用是常用,但是逼格不夠高啊。

舉個(gè)例子,如果你經(jīng)常在 LeetCode 上刷題,你會(huì)發(fā)現(xiàn)有時(shí) Java、C 需要幾十行的算法題,如果 Python 使用了?collections、itertools,可能只需要 3、4 代碼就完成了!

shutil 的便利

日常的編碼中,常會(huì)涉及到對(duì)文件、目錄等的操作場(chǎng)景,如果我們使用 os,可能需要對(duì)文件、文件夾,非空等進(jìn)行逐個(gè)判斷。

舉個(gè)例子: 我們現(xiàn)在要?jiǎng)h除一個(gè)目錄,目錄中包含有文件與文件夾,如果使用 os 模塊,沒(méi)有現(xiàn)成可以使用的函數(shù),需要我們進(jìn)行判斷與分類執(zhí)行。

import?os
#?path是文件的路徑,如果這個(gè)路徑是一個(gè)文件夾,
#?則會(huì)拋出OSError的錯(cuò)誤,這時(shí)需用用rmdir()來(lái)刪除
os.remove(path)
# path是文件夾路徑,注意文件夾需空的才能被刪除
os.rmdir(path)

多數(shù)初學(xué)者遇到刪除文件夾,想到的操作就是,創(chuàng)建兩個(gè)列表,然后用 os.walk 遍歷目錄,將文件與文件夾分別存入初始化的兩個(gè)列表中,然后先統(tǒng)一刪除文件,最后刪除文件夾。

如果有上面這樣操作的同學(xué),請(qǐng)面壁三分鐘。明顯沒(méi)有好好學(xué)習(xí) os.walk 函數(shù)

os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) top -- 是你所要遍歷的目錄的地址, 返回的是一個(gè)三元組(root,dirs,files)。

  • root 所指的是當(dāng)前正在遍歷的這個(gè)文件夾的本身的地址
  • dirs 是一個(gè) list ,內(nèi)容是該文件夾中所有的目錄的名字(不包括子目錄)
  • files 同樣是 list , 內(nèi)容是該文件夾中所有的文件(不包括子目錄)

topdown --可選,為 True,則優(yōu)先遍歷 top 目錄,否則優(yōu)先遍歷 top 的子目錄(默認(rèn)為開啟)。如果 topdown 參數(shù)為 True,walk 會(huì)遍歷top文件夾,與top 文件夾中每一個(gè)子目錄。

onerror -- 可選,需要一個(gè) callable 對(duì)象,當(dāng) walk 需要異常時(shí),會(huì)調(diào)用。

followlinks -- 可選,如果為 True,則會(huì)遍歷目錄下的快捷方式(linux 下是軟連接 symbolic link )實(shí)際所指的目錄(默認(rèn)關(guān)閉),如果為 False,則優(yōu)先遍歷 top 的子目錄。

只需要將 topdown 設(shè)置為 False,這樣在遍歷目錄時(shí),就會(huì)從根節(jié)點(diǎn)進(jìn)行遍歷,然后我們逐個(gè)刪除就 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))

說(shuō)這么多,無(wú)外乎為了引出最簡(jiǎn)便的方式 : shutil 模塊

如果換做 shutil 模塊登場(chǎng),那么執(zhí)行刪除目錄的操作,只需要 0.1 秒的時(shí)間

import?shutil
shutil.rmtree('D:\\software_temp')

就這樣,完事兒了...

文件解壓縮

日常工作中,我們經(jīng)常會(huì)使用 Python 進(jìn)行文件的解壓縮處理。

Python 自帶的解壓縮模塊有 zipfile, gzip, tarfile,如果我們需要解壓 rar 文件則需要單獨(dú)下載 rarfile 模塊,針對(duì)每一種壓縮文件,我們都需要針對(duì)文件類型進(jìn)行對(duì)應(yīng)模塊的使用

是不是很繁瑣?如果我們使用 shutil 呢?讓我們先來(lái)看看 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è)軟件下載中,你很少會(huì)見到 .rar 的文件,why?因?yàn)閷@?..

RAR是一種專利文件格式,用于數(shù)據(jù)壓縮與歸檔打包,開發(fā)者為尤金·羅謝爾(俄語(yǔ):Евгений Лазаревич Рошал,拉丁轉(zhuǎn)寫:Yevgeny Lazarevich Roshal),RAR的全名是“Roshal ARchive”,即“羅謝爾的歸檔”之意。首個(gè)公開版本RAR 1.3發(fā)布于1993年。

所以,有很多產(chǎn)品在軟件發(fā)布時(shí),開始使用一種壓縮率更高的 .7z 文件,這又是為什么?

7-zip 官方主頁(yè):

https://sparanoid.com/lab/7z/

在其中有一個(gè)許可協(xié)議是這樣寫的

許可協(xié)議:

7-Zip 是一款 開源 軟件。大多數(shù)源代碼都基于 GNU LGPL 許可協(xié)議下發(fā)布。AES 代碼基于 BSD 許可下發(fā)布。unRAR 代碼基于兩種許可:GNU LGPL 和 unRAR 限制許可。更多下許可信息請(qǐng)查看:7-Zip 許可。您可以在任何一臺(tái)計(jì)算機(jī)上使用 7-Zip ,包括用在商業(yè)用途的計(jì)算機(jī),不對(duì) 7-Zip 進(jìn)行捐贈(zèng)或支付并不影響您的使用。

shutil 擴(kuò)展 7z

說(shuō)了這么多 7z 文件的好處,可我們看到shutil并不能解壓該類型的文件啊。

我們能否讓 shutil 支持 .7z 文件,達(dá)到無(wú)腦解壓縮呢?

此時(shí),你需要?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)樗暮?jiǎn)單好用,更是由于他可以輕松集成于 shutil,來(lái)看看它的使用方式吧:

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')]

通過(guò)注冊(cè)我們看到,shutil 已經(jīng)支持 7z 文件的解壓了,就是如此簡(jiǎn)單

總結(jié)

以上是生活随笔為你收集整理的leetcode 解压缩_谁说 Python 的 shutil 不支持 7z 解压缩,我来教你扩展它的功能!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。