<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在我們常用的系統windows
和Linux
系統中有很多支援的壓縮包格式,包括但不限於以下種類:rar
、zip
、tar
,以下的標準庫的作用就是用於壓縮解壓縮其中一些格式的壓縮包。
import zipfile
zipfile
模組操作壓縮包使用ZipFile
類進行操作,使用方法和open
的使用方法很相似,也是使用r
、w
、x
、a
四種操作模式。基本步驟也是大致分為三步:開啟檔案、操作檔案、關閉檔案。可以使用with語法進行上下文自動操作。
注意一:zipfile也是rwxa四種模式,表示也會有檔案操作中游標指標的概念。
注意二:在Python中,幾乎所有涉及到檔案相關的操作都是開啟、操作、關閉三個步驟。
語法:ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)
引數 | 含義 |
---|---|
file | 檔案路徑 |
mode | 操作含義,與檔案操作中相同,預設為r。 |
compression | 壓縮方法,預設為ZIP_STORED。 |
allowZip64 | 操作的壓縮包檔案大小大於2G時應該True, 預設為True,不用管它。 |
模式 | 含義 |
---|---|
w | 建立一個新的壓縮包檔案。 |
r | 讀取已有的壓縮包檔案。 |
a | 向已有的壓縮包檔案中壓縮檔案。 |
在上面的compression引數中可以看到,預設的壓縮方法為ZIP_STORED。其實在zipfile模組中定義了一些壓縮方法常數,其中最常用的為以下兩種:
ZIP_STORED = 0 # 打包歸檔(不壓縮) ZIP_DEFLATED = 8 # 壓縮檔案(壓縮)
注意,壓縮方法指的是將檔案寫入壓縮包中採用的方法,所以,如果是解壓縮檔案,就沒必要指定這個壓縮方法了。
write -- 指定檔案寫入壓縮包(壓縮檔案)
語法:write(filename, arcname=None)
語法:write(壓縮檔案路徑,寫入壓縮包後的路徑和名字(預設原名))
寫入檔案如果是資料夾,那麼不會將資料夾中的內容一同寫入。
close -- 關閉物件(儲存檔案)
這是我要壓縮的資料夾。
使用ZIP_STORED壓縮。
import zipfile # 檔案路徑 zip_file_path = r'D:test.zip' # 壓縮包路徑 file_path = r'D:10-中日歐美資訊解析' # 被壓縮檔案 # 預設使用ZIP_STORED zf = zipfile.ZipFile(zip_file_path, 'w') # 寫入檔案(資料夾的話,不會將資料夾中的檔案一同寫入) zf.write(file_path) # 關閉檔案 zf.close()
可以看到,如果資料夾直接壓縮的話,不會將其中的檔案一同壓縮。
讓資料夾中的所有檔案迭代寫入壓縮包中。
import os import zipfile def writeZip(zf, file, arc_path=None): """迭代壓縮資料夾""" # 設定壓縮路徑 if arc_path is None: arc_path = rf'{os.path.basename(file)}' # 先壓縮本檔案 zf.write(file, arc_path) # 如果是資料夾 if os.path.isdir(file): # 獲取它所有的子檔案 inner_files = os.listdir(file) # 將所有的子檔案壓縮 for inner_file in inner_files: inner_file = f'{file}{os.sep}{inner_file}' arc = fr'{arc_path}{os.path.basename(inner_file)}' writeZip(zf, inner_file, arc) # 檔案路徑 zip_file_path = r'D:test.zip' # 壓縮包路徑 file_path = r'D:10-中日歐美資訊解析' # 被壓縮檔案 # 預設使用ZIP_STORED zf = zipfile.ZipFile(zip_file_path, 'w') # 寫入檔案(自定義一個函數,迭代壓縮資料夾) writeZip(zf, file_path) # 關閉檔案 zf.close()
現在就可以看到,雖然所有的檔案已經全部寫入壓縮包中,但是ZIP_STORED方法並沒有壓縮檔案。
改用ZIP_DEFLATED方法壓縮檔案。
import os import zipfile def writeZip(zf, file, arc_path=None): """迭代壓縮資料夾""" # 設定壓縮路徑 if arc_path is None: arc_path = rf'{os.path.basename(file)}' # 先壓縮本檔案 zf.write(file, arc_path) # 如果是資料夾 if os.path.isdir(file): # 獲取它所有的子檔案 inner_files = os.listdir(file) # 將所有的子檔案壓縮 for inner_file in inner_files: inner_file = f'{file}{os.sep}{inner_file}' arc = fr'{arc_path}{os.path.basename(inner_file)}' writeZip(zf, inner_file, arc) # 檔案路徑 zip_file_path = r'D:test.zip' # 壓縮包路徑 file_path = r'D:10-中日歐美資訊解析' # 被壓縮檔案 # 使用ZIP_DEFLATED壓縮 zf = zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED) # 寫入檔案(自定義一個函數,迭代壓縮資料夾) writeZip(zf, file_path) # 關閉檔案 zf.close()
可以看到,檔案是壓縮寫入內部的。
解壓縮
解壓縮有如下兩種方法,注意,解壓縮就是在讀檔案,要將操作模式變更為r
。
方法 | 說明 |
---|---|
extract | 解壓縮單個指定的檔案。 |
extractall | 解壓縮所有的檔案。 |
語法:extract(member,path=None, pwd=None)
語法:extract(指定檔案(壓縮包中的路徑),解壓到的位置(預設為當前工作目錄),指定的密碼(有些壓縮包有密碼,格式為位元組流))
語法:extractall(path=None, pwd=None)
語法:extractall(解壓到的位置, 密碼)
注意:解壓檔案和路徑中的資料夾同名會報錯,因為檔案無法重置資料夾。
namelist -- 迭代返回壓縮包中的檔案
import zipfile with zipfile.ZipFile(r'D:test.zip') as zf: res = zf.namelist() print(res) # ['10-中日歐美資訊解析/', '10-中日歐美資訊解析/1-程式碼/', ...]
infolist -- 迭代返回壓縮包中的檔案資訊
比如檔案的許可權等。
printdir -- 檢視壓縮包中的檔案的資訊
檢視壓縮包中的檔案資訊,比如檔案的大小、建立日期等。預設檢視所有的檔案。
語法:printdir(file=None)
import tarfile
tarfile的使用和檔案操作更加的相似,只是在壓縮模式上略有不同。
使用linux系統的朋友都知道,tar是Linux的一種打包方式,打包成為tar包之後,才可以使用其它的壓縮程式去壓縮。最常用的壓縮方式是gzip,壓縮率最高的方式bzip2,此外還支援另一種比較小眾的xzip格式。
主要操作方法為tarfile.TarFile.open()
,可以直接tarfile.open()
。
語法:open(name, mode='r')
當初在學習的時候,老師還教有encoding='UTF-8'引數,但是檔案操作要什麼編碼格式?感覺他是為了方便直接從檔案操作的程式碼上直接複製過來的,然後沒有刪掉。
模式為r
、w
、a
、x
四種為主,外加使用add方法寫入檔案,退出依然使用close方法。
add(name, arcname)
add(壓縮檔案,壓縮別名)
注意,壓縮別名一定不要以路徑分隔符為結尾,否則只會建立一個資料夾。
import tarfile with tarfile.open('test.tar', 'w') as tf: tf.add('test.txt')
壓縮的方式主要是將模式改變,在rwx
的基礎上加上各個壓縮的方式,變成:r:gz
、w:bz2
、x:xz
等樣式,然後在將剛才建立的tar包壓縮,當然也可以直接將檔案壓縮成為壓縮包。
注意,a
模式不能配備任何壓縮模式,因為gzip、bzip2、xzip不能直接往裡面追加檔案,所以如果要追加檔案,將tar包解壓縮出來,然後追加再壓縮。
import tarfile # tar包以gzip格式壓縮 with tarfile.open('test.tar.gz', 'w:gz') as tf: tf.add('test.tar')
tarfile的解壓縮方法和zipfile的一模一樣。
方法 | 含義 |
---|---|
extract | 解壓縮指定檔案 |
extractall | 解壓縮所有檔案 |
getnames -- 返回壓縮包中的檔案(list)
zipfile和tarfile不支援刪除壓縮包中的檔案,所以如果有需要刪除壓縮包中的檔案,可以將壓縮包解壓出來,然後刪除其中的檔案,再壓縮。
到此這篇關於Python標準庫之zipfile和tarfile模組的使用的文章就介紹到這了,更多相關Python zipfile tarfile模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45