tarfile
--- 讀寫tar歸檔文件?
源代碼: Lib/tarfile.py
tarfile
模塊可以用來(lái)讀寫 tar 歸檔,包括使用 gzip, bz2 和 lzma 壓縮的歸檔。 請(qǐng)使用 zipfile
模塊來(lái)讀寫 .zip
文件,或者使用 shutil 的高層級(jí)函數(shù)。
一些事實(shí)和數(shù)字:
支持讀取 / 寫入 POSIX.1-1988 (ustar) 格式。
對(duì) GNU tar 格式的讀/寫支持,包括 longname 和 longlink 擴(kuò)展,對(duì)所有種類 sparse 擴(kuò)展的只讀支持,包括 sparse 文件的恢復(fù)。
對(duì) POSIX.1-2001 (pax) 格式的讀/寫支持。
處理目錄、正常文件、硬鏈接、符號(hào)鏈接、fifo 管道、字符設(shè)備和塊設(shè)備,并且能夠獲取和恢復(fù)文件信息例如時(shí)間戳、訪問(wèn)權(quán)限和所有者等。
在 3.3 版更改: 添加了對(duì) lzma
壓縮的支持。
- tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)?
針對(duì)路徑名 name 返回
TarFile
對(duì)象。 有關(guān)TarFile
對(duì)象以及所允許的關(guān)鍵字參數(shù)的詳細(xì)信息請(qǐng)參閱 TarFile 對(duì)象。mode 必須是
'filemode[:compression]'
形式的字符串,其默認(rèn)值為'r'
。 以下是模式組合的完整列表:模式
action
'r' or 'r:*'
打開(kāi)和讀取使用透明壓縮(推薦)。
'r:'
打開(kāi)和讀取不使用壓縮。
'r:gz'
打開(kāi)和讀取使用gzip 壓縮。
'r:bz2'
打開(kāi)和讀取使用bzip2 壓縮。
'r:xz'
打開(kāi)和讀取使用lzma 壓縮。
'x'
或'x:'
Create a tarfile exclusively without compression. Raise a
FileExistsError
exception if it already exists.'x:gz'
Create a tarfile with gzip compression. Raise a
FileExistsError
exception if it already exists.'x:bz2'
Create a tarfile with bzip2 compression. Raise a
FileExistsError
exception if it already exists.'x:xz'
Create a tarfile with lzma compression. Raise a
FileExistsError
exception if it already exists.'a' or 'a:'
打開(kāi)以便在沒(méi)有壓縮的情況下追加。如果文件不存在,則創(chuàng)建該文件。
'w' or 'w:'
打開(kāi)用于未壓縮的寫入。
'w:gz'
打開(kāi)用于 gzip 壓縮的寫入。
'w:bz2'
打開(kāi)用于 bzip2 壓縮的寫入。
'w:xz'
打開(kāi)用于 lzma 壓縮的寫入。
請(qǐng)注意
'a:gz'
,'a:bz2'
或'a:xz'
是不可能的組合。 如果 mode 不適用于打開(kāi)特定(壓縮的)文件用于讀取,則會(huì)引發(fā)ReadError
。 請(qǐng)使用 mode'r'
來(lái)避免這種情況。 如果某種壓縮方法不受支持,則會(huì)引發(fā)CompressionError
。如果指定了 fileobj,它會(huì)被用作對(duì)應(yīng)于 name 的以二進(jìn)制模式打開(kāi)的 file object 的替代。 它會(huì)被設(shè)定為處在位置 0。
對(duì)于
'w:gz'
,'r:gz'
,'w:bz2'
,'r:bz2'
,'x:gz'
,'x:bz2'
等模式,tarfile.open()
接受關(guān)鍵字參數(shù) compresslevel (默認(rèn)值為9
) 來(lái)指定文件的壓縮等級(jí)。對(duì)于
'w:xz'
和'x:xz'
模式,tarfile.open()
接受關(guān)鍵字參數(shù) preset 來(lái)指定文件的壓縮等級(jí)。針對(duì)特殊的目的,還存在第二種 mode 格式:
'filemode|[compression]'
。tarfile.open()
將返回一個(gè)將其數(shù)據(jù)作為數(shù)據(jù)塊流來(lái)處理的TarFile
對(duì)象。 對(duì)此文件將不能執(zhí)行隨機(jī)查找。 如果給定了 fileobj,它可以是任何具有read()
或write()
方法 (由 mode 確定) 的對(duì)象。 bufsize 指定塊大小,默認(rèn)值為20 * 512
字節(jié)。 可與此格式組合使用的有sys.stdin
, 套接字 file object 或磁帶設(shè)備等。 但是,對(duì)于這樣的TarFile
對(duì)象存在不允許隨機(jī)訪問(wèn)的限制,參見(jiàn) 例子。 目前可用的模式如下:模式
動(dòng)作
'r|*'
打開(kāi) tar 塊的 流 以進(jìn)行透明壓縮讀取。
'r|'
打開(kāi)一個(gè)未壓縮的 tar 塊的 stream 用于讀取。
'r|gz'
打開(kāi)一個(gè) gzip 壓縮的 stream 用于讀取。
'r|bz2'
打開(kāi)一個(gè) bzip2 壓縮的 stream 用于讀取。
'r|xz'
打開(kāi)一個(gè) lzma 壓縮 stream 用于讀取。
'w|'
打開(kāi)一個(gè)未壓縮的 stream 用于寫入。
'w|gz'
打開(kāi)一個(gè) gzip 壓縮的 stream 用于寫入。
'w|bz2'
打開(kāi)一個(gè) bzip2 壓縮的 stream 用于寫入。
'w|xz'
打開(kāi)一個(gè) lzma 壓縮的 stream 用于寫入。
在 3.5 版更改: 添加了
'x'
(單獨(dú)創(chuàng)建) 模式。在 3.6 版更改: name 形參接受一個(gè) path-like object。
- class tarfile.TarFile
用于讀取和寫入 tar 歸檔的類。 請(qǐng)不要直接使用這個(gè)類:而要使用
tarfile.open()
。 參見(jiàn) TarFile 對(duì)象。
- tarfile.is_tarfile(name)?
如果 name 是一個(gè)
tarfile
能讀取的 tar 歸檔文件則返回True
。 name 可以為str
,文件或文件類對(duì)象。在 3.9 版更改: 支持文件或類文件對(duì)象。
tarfile
模塊定義了以下異常:
- exception tarfile.ReadError?
當(dāng)一個(gè)不能被
tarfile
模塊處理或者因某種原因而無(wú)效的 tar 歸檔被打開(kāi)時(shí)將被引發(fā)。
- exception tarfile.CompressionError?
當(dāng)一個(gè)壓縮方法不受支持或者當(dāng)數(shù)據(jù)無(wú)法被正確解碼時(shí)將被引發(fā)。
- exception tarfile.ExtractError?
當(dāng)使用
TarFile.extract()
時(shí)針對(duì) non-fatal 所引發(fā)的異常,但是僅限TarFile.errorlevel
== 2
。
- exception tarfile.HeaderError?
如果獲取的緩沖區(qū)無(wú)效則會(huì)由
TarInfo.frombuf()
引發(fā)的異常。
以下常量在模塊層級(jí)上可用:
- tarfile.ENCODING?
默認(rèn)的字符編碼格式:在 Windows 上為
'utf-8'
,其他系統(tǒng)上則為sys.getfilesystemencoding()
所返回的值。
以下常量各自定義了一個(gè) tarfile
模塊能夠創(chuàng)建的 tar 歸檔格式。 相關(guān)細(xì)節(jié)請(qǐng)參閱 受支持的 tar 格式 小節(jié)。
- tarfile.USTAR_FORMAT?
POSIX.1-1988 (ustar) 格式。
- tarfile.GNU_FORMAT?
GNU tar 格式。
- tarfile.PAX_FORMAT?
POSIX.1-2001 (pax) 格式。
- tarfile.DEFAULT_FORMAT?
用于創(chuàng)建歸檔的默認(rèn)格式。 目前為
PAX_FORMAT
。在 3.8 版更改: 新歸檔的默認(rèn)格式已更改為
PAX_FORMAT
而不再是GNU_FORMAT
。
參見(jiàn)
- 模塊
zipfile
zipfile
標(biāo)準(zhǔn)模塊的文檔。- 歸檔操作
標(biāo)準(zhǔn)
shutil
模塊所提供的高層級(jí)歸檔工具的文檔。- GNU tar manual, Basic Tar Format
針對(duì) tar 歸檔文件的文檔,包含 GNU tar 擴(kuò)展。
TarFile 對(duì)象?
TarFile
對(duì)象提供了一個(gè) tar 歸檔的接口。 一個(gè) tar 歸檔就是數(shù)據(jù)塊的序列。 一個(gè)歸檔成員(被保存文件)是由一個(gè)標(biāo)頭塊加多個(gè)數(shù)據(jù)塊組成的。 一個(gè)文件可以在一個(gè) tar 歸檔中多次被保存。 每個(gè)歸檔成員都由一個(gè) TarInfo
對(duì)象來(lái)代表,詳情參見(jiàn) TarInfo 對(duì)象。
TarFile
對(duì)象可在 with
語(yǔ)句中作為上下文管理器使用。 當(dāng)語(yǔ)句塊結(jié)束時(shí)它將自動(dòng)被關(guān)閉。 請(qǐng)注意在發(fā)生異常事件時(shí)被打開(kāi)用于寫入的歸檔將不會(huì)被終結(jié);只有內(nèi)部使用的文件對(duì)象將被關(guān)閉。 相關(guān)用例請(qǐng)參見(jiàn) 例子。
3.2 新版功能: 添加了對(duì)上下文管理器協(xié)議的支持。
- class tarfile.TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=0)?
下列所有參數(shù)都是可選項(xiàng)并且也可作為實(shí)例屬性來(lái)訪問(wèn)。
name 是歸檔的路徑名稱。 name 可以是一個(gè) path-like object。 如果給定了 fileobj 則它可以被省略。 在此情況下,如果對(duì)象的
name
屬性存在則它會(huì)被使用。mode 可以為
'r'
表示從現(xiàn)有歸檔讀取,'a'
表示將數(shù)據(jù)追加到現(xiàn)有文件,'w'
表示創(chuàng)建新文件覆蓋現(xiàn)有文件,或者'x'
表示僅在文件不存在時(shí)創(chuàng)建新文件。如果給定了 fileobj,它會(huì)被用于讀取或?qū)懭霐?shù)據(jù)。 如果可以被確定,則 mode 會(huì)被 fileobj 的模式所覆蓋。 fileobj 的使用將從位置 0 開(kāi)始。
備注
當(dāng)
TarFile
被關(guān)閉時(shí),fileobj 不會(huì)被關(guān)閉。format 控制用于寫入的歸檔格式。 它必須為在模塊層級(jí)定義的常量
USTAR_FORMAT
,GNU_FORMAT
或PAX_FORMAT
中的一個(gè)。 當(dāng)讀取時(shí),格式將被自動(dòng)檢測(cè),即使單個(gè)歸檔中存在不同的格式。tarinfo 參數(shù)可以被用來(lái)將默認(rèn)的
TarInfo
類替換為另一個(gè)。如果 dereference 為
False
,則會(huì)將符號(hào)鏈接和硬鏈接添加到歸檔中。 如果為True
,則會(huì)將目標(biāo)文件的內(nèi)容添加到歸檔中。 在不支持符號(hào)鏈接的系統(tǒng)上參數(shù)將不起作用。如果 ignore_zeros 為
False
,則會(huì)將空的數(shù)據(jù)塊當(dāng)作歸檔的末尾來(lái)處理。 如果為True
,則會(huì)跳過(guò)空的(和無(wú)效的)數(shù)據(jù)塊并嘗試獲取盡可能多的成員。 此參數(shù)僅適用于讀取拼接的或損壞的歸檔。debug 可設(shè)為從
0
(無(wú)調(diào)試消息) 到3
(全部調(diào)試消息)。 消息會(huì)被寫入到sys.stderr
。如果 errorlevel 為
0
,則當(dāng)使用TarFile.extract()
時(shí)會(huì)忽略所有錯(cuò)誤。 無(wú)論何種情況,當(dāng)啟用調(diào)試時(shí)它們都將被顯示為調(diào)試輸出的錯(cuò)誤消息。 如果為1
,則所有 fatal 錯(cuò)誤會(huì)被作為OSError
異常被引發(fā)。 如果為2
,則所有 non-fatal 錯(cuò)誤也會(huì)被作為TarError
異常被引發(fā)。encoding 和 errors 參數(shù)定義了讀取或?qū)懭霘w檔所使用的字符編碼格式以及要如何處理轉(zhuǎn)換錯(cuò)誤。 默認(rèn)設(shè)置將適用于大多數(shù)用戶。 要深入了解詳情可參閱 Unicode 問(wèn)題 小節(jié)。
可選的 pax_headers 參數(shù)是字符串的字典,如果 format 為
PAX_FORMAT
它將被作為 pax 全局標(biāo)頭被添加。在 3.2 版更改: 使用
'surrogateescape'
作為 errors 參數(shù)的默認(rèn)值。在 3.5 版更改: 添加了
'x'
(單獨(dú)創(chuàng)建) 模式。在 3.6 版更改: name 形參接受一個(gè) path-like object。
- classmethod TarFile.open(...)?
作為替代的構(gòu)造器。
tarfile.open()
函數(shù)實(shí)際上是這個(gè)類方法的快捷方式。
- TarFile.getmember(name)?
返回成員 name 的
TarInfo
對(duì)象。 如果 name 在歸檔中找不到,則會(huì)引發(fā)KeyError
。備注
如果一個(gè)成員在歸檔中出現(xiàn)超過(guò)一次,它的最后一次出現(xiàn)會(huì)被視為是最新的版本。
- TarFile.getnames()?
以名稱列表的形式返回成員。 它的順序與
getmembers()
所返回列表的順序一致。
- TarFile.list(verbose=True, *, members=None)?
將內(nèi)容清單打印到
sys.stdout
。 如果 verbose 為False
,則將只打印成員名稱。 如果為True
,則輸出將類似于 ls -l 的輸出效果。 如果給定了可選的 members,它必須為getmembers()
所返回的列表的一個(gè)子集。在 3.5 版更改: 添加了 members 形參。
- TarFile.next()?
當(dāng)
TarFile
被打開(kāi)用于讀取時(shí),以TarInfo
對(duì)象的形式返回歸檔的下一個(gè)成員。 如果不再有可用對(duì)象則返回None
。
- TarFile.extractall(path='.', members=None, *, numeric_owner=False)?
將歸檔中的所有成員提取到當(dāng)前工作目錄或 path 目錄。 如果給定了可選的 members,則它必須為
getmembers()
所返回的列表的一個(gè)子集。 字典信息例如所有者、修改時(shí)間和權(quán)限會(huì)在所有成員提取完畢后被設(shè)置。 這樣做是為了避免兩個(gè)問(wèn)題:目錄的修改時(shí)間會(huì)在每當(dāng)在其中創(chuàng)建文件時(shí)被重置。 并且如果目錄的權(quán)限不允許寫入,提取文件到目錄的操作將失敗。如果 numeric_owner 為
True
,則將使用來(lái)自 tarfile 的 uid 和 gid 數(shù)值來(lái)設(shè)置被提取文件的所有者/用戶組。 在其他情況下,則會(huì)使用來(lái)自 tarfile 的名稱值。警告
絕不要未經(jīng)預(yù)先檢驗(yàn)就從不可靠的源中提取歸檔文件。 這樣有可能在 path 之外創(chuàng)建文件,例如某些成員具有以
"/"
開(kāi)始的絕對(duì)路徑文件名或帶有兩個(gè)點(diǎn)號(hào)".."
的文件名。在 3.5 版更改: 添加了 numeric_owner 形參。
在 3.6 版更改: path 形參接受一個(gè) path-like object。
- TarFile.extract(member, path='', set_attrs=True, *, numeric_owner=False)?
從歸檔中提取出一個(gè)成員放入當(dāng)前工作目錄,將使用其完整名稱。 成員的文件信息會(huì)盡可能精確地被提取。 member 可以是一個(gè)文件名或
TarInfo
對(duì)象。 你可以使用 path 指定一個(gè)不同的目錄。 path 可以是一個(gè) path-like object。 將會(huì)設(shè)置文件屬性 (owner, mtime, mode) 除非 set_attrs 為假值。如果 numeric_owner 為
True
,則將使用來(lái)自 tarfile 的 uid 和 gid 數(shù)值來(lái)設(shè)置被提取文件的所有者/用戶組。 在其他情況下,則會(huì)使用來(lái)自 tarfile 的名稱值。備注
extract()
方法不會(huì)處理某些提取問(wèn)題。 在大多數(shù)情況下你應(yīng)當(dāng)考慮使用extractall()
方法。警告
查看
extractall()
的警告信息。在 3.2 版更改: 添加了 set_attrs 形參。
在 3.5 版更改: 添加了 numeric_owner 形參。
在 3.6 版更改: path 形參接受一個(gè) path-like object。
- TarFile.extractfile(member)?
將歸檔中的一個(gè)成員提取為文件對(duì)象。 member 可以是一個(gè)文件名或
TarInfo
對(duì)象。 如果 member 是一個(gè)常規(guī)文件或鏈接,則會(huì)返回一個(gè)io.BufferedReader
對(duì)象。 對(duì)于所有其他現(xiàn)有成員,則都將返回None
。 如果 member 未在歸檔中出現(xiàn),則會(huì)引發(fā)KeyError
。在 3.3 版更改: 返回一個(gè)
io.BufferedReader
對(duì)象。
- TarFile.add(name, arcname=None, recursive=True, *, filter=None)?
將文件 name 添加到歸檔。 name 可以為任意類型的文件(目錄、fifo、符號(hào)鏈接等等)。 如果給出 arcname 則它將為歸檔中的文件指定一個(gè)替代名稱。 默認(rèn)情況下會(huì)遞歸地添加目錄。 這可以通過(guò)將 recursive 設(shè)為
False
來(lái)避免。 遞歸操作會(huì)按排序順序添加條目。 如果給定了 filter,它應(yīng)當(dāng)為一個(gè)接受TarInfo
對(duì)象并返回已修改TarInfo
對(duì)象的函數(shù)。 如果它返回None
則TarInfo
對(duì)象將從歸檔中被排除。 具體示例參見(jiàn) 例子。在 3.2 版更改: 添加了 filter 形參。
在 3.7 版更改: 遞歸操作按排序順序添加條目。
- TarFile.addfile(tarinfo, fileobj=None)?
將
TarInfo
對(duì)象 tarinfo 添加到歸檔。 如果給定了 fileobj,它應(yīng)當(dāng)是一個(gè) binary file,并會(huì)從中讀取tarinfo.size
個(gè)字節(jié)添加到歸檔。 你可以直接創(chuàng)建TarInfo
對(duì)象,或是使用gettarinfo()
來(lái)創(chuàng)建。
- TarFile.gettarinfo(name=None, arcname=None, fileobj=None)?
基于
os.stat()
的結(jié)果或者現(xiàn)有文件的相同數(shù)據(jù)創(chuàng)建一個(gè)TarInfo
。 文件或者是命名為 name,或者是使用文件描述符指定為一個(gè) file object fileobj。 name 可以是一個(gè) path-like object。 如果給定了 arcname,則它將為歸檔中的文件指定一個(gè)替代名稱,在其他情況下,名稱將從 fileobj 的name
屬性或 name 參數(shù)獲取。 名稱應(yīng)當(dāng)是一個(gè)文本字符串。你可以在使用
addfile()
添加TarInfo
的某些屬性之前修改它們。 如果文件對(duì)象不是從文件開(kāi)頭進(jìn)行定位的普通文件對(duì)象,size
之類的屬性就可能需要修改。 例如GzipFile
之類的文件就屬于這種情況。name
也可以被修改,在這種情況下 arcname 可以是一個(gè)占位字符串。在 3.6 版更改: name 形參接受一個(gè) path-like object。
- TarFile.pax_headers?
一個(gè)包含 pax 全局標(biāo)頭的鍵值對(duì)的字典。
TarInfo 對(duì)象?
TarInfo
對(duì)象代表 TarFile
中的一個(gè)文件。 除了會(huì)存儲(chǔ)所有必要的文件屬性(例如文件類型、大小、時(shí)間、權(quán)限、所有者等),它還提供了一些確定文件類型的有用方法。 此對(duì)象 并不 包含文件數(shù)據(jù)本身。
TarInfo
對(duì)象可通過(guò) TarFile
的方法 getmember()
, getmembers()
和 gettarinfo()
返回。
- classmethod TarInfo.frombuf(buf, encoding, errors)?
基于字符串緩沖區(qū) buf 創(chuàng)建并返回一個(gè)
TarInfo
對(duì)象。如果緩沖區(qū)無(wú)效則會(huì)引發(fā)
HeaderError
。
- classmethod TarInfo.fromtarfile(tarfile)?
從
TarFile
對(duì)象 tarfile 讀取下一個(gè)成員并將其作為TarInfo
對(duì)象返回。
- TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape')?
基于
TarInfo
對(duì)象創(chuàng)建一個(gè)字符串緩沖區(qū)。 有關(guān)參數(shù)的信息請(qǐng)參見(jiàn)TarFile
類的構(gòu)造器。在 3.2 版更改: 使用
'surrogateescape'
作為 errors 參數(shù)的默認(rèn)值。
TarInfo
對(duì)象具有以下公有數(shù)據(jù)屬性:
- TarInfo.name?
歸檔成員的名稱。
- TarInfo.size?
以字節(jié)表示的大小。
- TarInfo.mtime?
上次修改的時(shí)間。
- TarInfo.mode?
權(quán)限位。
- TarInfo.type?
文件類型。 type 通常為以下常量之一:
REGTYPE
,AREGTYPE
,LNKTYPE
,SYMTYPE
,DIRTYPE
,FIFOTYPE
,CONTTYPE
,CHRTYPE
,BLKTYPE
,GNUTYPE_SPARSE
。 要更方便地確定一個(gè)TarInfo
對(duì)象的類型,請(qǐng)使用下述的is*()
方法。
- TarInfo.uid?
最初保存該成員的用戶的用戶 ID。
- TarInfo.gid?
最初保存該成員的用戶的分組 ID。
- TarInfo.uname?
用戶名。
- TarInfo.gname?
分組名。
- TarInfo.pax_headers?
一個(gè)包含所關(guān)聯(lián)的 pax 擴(kuò)展標(biāo)頭的鍵值對(duì)的字典。
TarInfo
對(duì)象還提供了一些便捷查詢方法:
命令行接口?
3.4 新版功能.
tarfile
模塊提供了簡(jiǎn)單的命令行接口以便與 tar 歸檔進(jìn)行交互。
如果你想要?jiǎng)?chuàng)建一個(gè)新的 tar 歸檔,請(qǐng)?jiān)?-c
選項(xiàng)后指定其名稱然后列出應(yīng)當(dāng)被包含的文件名:
$ python -m tarfile -c monty.tar spam.txt eggs.txt
傳入一個(gè)字典也是可接受的:
$ python -m tarfile -c monty.tar life-of-brian_1979/
如果你想要將一個(gè) tar 歸檔提取到指定的目錄,請(qǐng)使用 -e
選項(xiàng):
$ python -m tarfile -e monty.tar
你也可以通過(guò)傳入目錄名稱將一個(gè) tar 歸檔提取到不同的目錄:
$ python -m tarfile -e monty.tar other-dir/
要獲取一個(gè) tar 歸檔中文件的列表,請(qǐng)使用 -l
選項(xiàng):
$ python -m tarfile -l monty.tar
命令行選項(xiàng)?
- -c <tarfile> <source1> ... <sourceN>?
- --create <tarfile> <source1> ... <sourceN>?
基于源文件創(chuàng)建 tarfile。
- -e <tarfile> [<output_dir>]?
- --extract <tarfile> [<output_dir>]?
如果未指定 output_dir 則會(huì)將 tarfile 提取到當(dāng)前目錄。
- -v, --verbose?
更詳細(xì)地輸出結(jié)果。
例子?
如何將整個(gè) tar 歸檔提取到當(dāng)前工作目錄:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
如何通過(guò) TarFile.extractall()
使用生成器函數(shù)而非列表來(lái)提取一個(gè) tar 歸檔的子集:
import os
import tarfile
def py_files(members):
for tarinfo in members:
if os.path.splitext(tarinfo.name)[1] == ".py":
yield tarinfo
tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
如何基于一個(gè)文件名列表創(chuàng)建未壓縮的 tar 歸檔:
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
tar.add(name)
tar.close()
使用 with
語(yǔ)句的同一個(gè)示例:
import tarfile
with tarfile.open("sample.tar", "w") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
如何讀取一個(gè) gzip 壓縮的 tar 歸檔并顯示一些成員信息:
import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="")
if tarinfo.isreg():
print("a regular file.")
elif tarinfo.isdir():
print("a directory.")
else:
print("something else.")
tar.close()
如何創(chuàng)建一個(gè)歸檔并使用 TarFile.add()
中的 filter 形參來(lái)重置用戶信息:
import tarfile
def reset(tarinfo):
tarinfo.uid = tarinfo.gid = 0
tarinfo.uname = tarinfo.gname = "root"
return tarinfo
tar = tarfile.open("sample.tar.gz", "w:gz")
tar.add("foo", filter=reset)
tar.close()
受支持的 tar 格式?
通過(guò) tarfile
模塊可以創(chuàng)建三種 tar 格式:
The POSIX.1-1988 ustar 格式 (
USTAR_FORMAT
)。 它支持最多 256 個(gè)字符的文件名長(zhǎng)度和最多 100 個(gè)字符的鏈接名長(zhǎng)度。 文件大小上限為 8 GiB。 這是一種老舊但廣受支持的格式。GNU tar 格式 (
GNU_FORMAT
)。 它支持長(zhǎng)文件名和鏈接名、大于 8 GiB 的文件以及稀疏文件。 它是 GNU/Linux 系統(tǒng)上的事實(shí)標(biāo)準(zhǔn)。tarfile
完全支持針對(duì)長(zhǎng)名稱的 GNU tar 擴(kuò)展,稀疏文件支持則限制為只讀。POSIX.1-2001 pax 格式 (
PAX_FORMAT
)。 它是幾乎無(wú)限制的最靈活格式。 它支持長(zhǎng)文件名和鏈接名,大文件以及使用便捷方式存儲(chǔ)路徑名。 現(xiàn)代的 tar 實(shí)現(xiàn),包括 GNU tar, bsdtar/libarchive 和 star,完全支持?jǐn)U展 pax 特性;某些老舊或不維護(hù)的庫(kù)可能不受支持,但應(yīng)當(dāng)會(huì)將 pax 歸檔視為廣受支持的 ustar 格式。 這是目前新建歸檔的默認(rèn)格式。它擴(kuò)展了現(xiàn)有的 ustar 格式,包括用于無(wú)法以其他方式存儲(chǔ)的附加標(biāo)頭。 存在兩種形式的 pax 標(biāo)頭:擴(kuò)展標(biāo)頭只影響后續(xù)的文件標(biāo)頭,全局標(biāo)頭則適用于完整歸檔并會(huì)影響所有后續(xù)的文件。 為了便于移植,在 pax 標(biāo)頭中的所有數(shù)據(jù)均以 UTF-8 編碼。
還有一些 tar 格式的其他變種,它們可以被讀取但不能被創(chuàng)建:
古老的 V7 格式。 這是來(lái)自 Unix 第七版的第一個(gè) tar 格式,它只存儲(chǔ)常規(guī)文件和目錄。 名稱長(zhǎng)度不能超過(guò) 100 個(gè)字符,并且沒(méi)有用戶/分組名信息。 某些歸檔在帶有非 ASCII 字符字段的情況下會(huì)產(chǎn)生計(jì)算錯(cuò)誤的標(biāo)頭校驗(yàn)和。
SunOS tar 擴(kuò)展格式。 此格式是 POSIX.1-2001 pax 格式的一個(gè)變種,但并不保持兼容。
Unicode 問(wèn)題?
最初 tar 格式被設(shè)計(jì)用來(lái)在磁帶機(jī)上生成備份,主要關(guān)注于保存文件系統(tǒng)信息。 現(xiàn)在 tar 歸檔通常用于文件分發(fā)和在網(wǎng)絡(luò)上交換歸檔。 最初格式(它是所有其他格式的基礎(chǔ))的一個(gè)問(wèn)題是它沒(méi)有支持不同字符編碼格式的概念。 例如,一個(gè)在 UTF-8 系統(tǒng)上創(chuàng)建的普通 tar 歸檔如果包含非 ASCII 字符則將無(wú)法在 Latin-1 系統(tǒng)上被正確讀取。 文本元數(shù)據(jù)(例如文件名,鏈接名,用戶/分組名)將變?yōu)閾p壞狀態(tài)。 不幸的是,沒(méi)有什么辦法能夠自動(dòng)檢測(cè)一個(gè)歸檔的編碼格式。 pax 格式被設(shè)計(jì)用來(lái)解決這個(gè)問(wèn)題。 它使用通用字符編碼格式 UTF-8 來(lái)存儲(chǔ)非 ASCII 元數(shù)據(jù)。
在 tarfile
中字符轉(zhuǎn)換的細(xì)節(jié)由 TarFile
類的 encoding 和 errors 關(guān)鍵字參數(shù)控制。
encoding 定義了用于歸檔中元數(shù)據(jù)的字符編碼格式。 默認(rèn)值為 sys.getfilesystemencoding()
或是回退選項(xiàng) 'ascii'
。 根據(jù)歸檔是被讀取還是被寫入,元數(shù)據(jù)必須被解碼或編碼。 如果沒(méi)有正確設(shè)置 encoding,轉(zhuǎn)換可能會(huì)失敗。
errors 參數(shù)定義了不能被轉(zhuǎn)換的字符將如何處理。 可能的取值在 錯(cuò)誤處理方案 小節(jié)列出。 默認(rèn)方案為 'surrogateescape'
,它也被 Python 用于文件系統(tǒng)調(diào)用,參見(jiàn) 文件名,命令行參數(shù),以及環(huán)境變量。。
對(duì)于 PAX_FORMAT
歸檔(默認(rèn)格式),encoding 通常是不必要的,因?yàn)樗性獢?shù)據(jù)都使用 UTF-8 來(lái)存儲(chǔ)。 encoding 僅在解碼二進(jìn)制 pax 標(biāo)頭或存儲(chǔ)帶有替代字符的字符串等少數(shù)場(chǎng)景下會(huì)被使用。