做自(zì)由與創造的先行者

數據壓縮 | Data Compression tarfile

Python開(kāi)發手冊

該tarfile模塊可以讀寫tar檔案,包括使用(yòng)gzip或bz2壓縮的檔案。使用(yòng)該zipfile模塊讀取或寫入.zip文(wén)件,或shutil中的更高(gāo)級别的函數。

一些(xiē)事(shì)實和(hé)數字:

如果各個模塊可用(yòng),則讀取和(hé)寫入gzip并bz2壓縮歸檔。

讀/寫支持POSIX.1-1988(ustar)格式。

對(duì)GNU tar格式的讀/寫支持,包括長名稱和(hé)長鏈接擴展,對(duì)稀疏擴展的隻讀支持。

讀/寫支持POSIX.1-2001(pax)格式。

2.6版本中的新功能(néng)。

處理(lǐ)目錄,常規文(wén)件,硬鏈接,符号鏈接,fifo,字符設備和(hé)塊設備,并能(néng)夠獲取和(hé)恢複文(wén)件信息,如時(shí)間戳,訪問權限和(hé)所有者。

版本3.3中更改:增加了(le)對(duì)lzma壓縮的支持。

tarfile.open(name = None,mode ='r',fileobj = None,bufsize = 10240,** kwargs)

TarFile爲路徑名稱返回一個對(duì)象。有關TarFile允許的對(duì)象和(hé)關鍵字參數的詳細信息,請(qǐng)參閱TarFile對(duì)象。

模式必須是表單的字符串'filemode[:compression]',它默認爲'r'。以下(xià)是模式組合的完整列表:

模式

行動

'r' or 'r:*'

透明(míng)壓縮打開(kāi)(推薦)。

'r:'

打開(kāi)閱讀專門(mén)沒有壓縮。

'r:gz'

用(yòng)gzip壓縮打開(kāi)。

'r:bz2'

用(yòng)bzip2壓縮打開(kāi)閱讀。

'r:xz'

打開(kāi)閱讀lzma壓縮。

'x' 要麽 'x:'

創建一個tar文(wén)件而不壓縮。FileExistsError如果它已經存在,則引發異常。

'x:gz'

用(yòng)gzip壓縮創建一個tar文(wén)件。FileExistsError如果它已經存在,則引發異常。

'x:bz2'

用(yòng)bzip2壓縮創建一個tar文(wén)件。FileExistsError如果它已經存在,則引發異常。

'x:xz'

用(yòng)lzma壓縮創建一個tar文(wén)件。FileExistsError如果它已經存在,則引發異常。

'a' or 'a:'

打開(kāi)後不需要壓縮。如果該文(wén)件不存在,則會(huì)創建該文(wén)件。

'w' or 'w:'

打開(kāi)未壓縮的文(wén)字。

'w:gz'

打開(kāi)gzip壓縮文(wén)字。

'w:bz2'

打開(kāi)bzip2壓縮文(wén)字。

'w:xz'

打開(kāi)lzma壓縮文(wén)字。

請(qǐng)注意'a:gz','a:bz2'或'a:xz'不可能(néng)。如果模式 不适合打開(kāi)某個(壓縮)的文(wén)件進行讀取,ReadError則會(huì)引發。使用(yòng)模式 'r'來(lái)避免這(zhè)種情況。如果不支持壓縮方法,CompressionError則會(huì)引發。

如果指定了(le)fileobj,那麽它将用(yòng)作(zuò) 以二進制模式打開(kāi)的名稱文(wén)件對(duì)象的替代方案。它應該在位置0。

對(duì)于模式'w:gz','r:gz','w:bz2','r:bz2','x:gz', 'x:bz2',tarfile.open()接受關鍵字參數compresslevel(默認9)來(lái)指定該文(wén)件的壓縮級别。

對(duì)于特殊用(yòng)途,對(duì)于第二格式模式: 'filemode|[compression]'。 tarfile.open()将返回一個TarFile對(duì)象,它将數據作(zuò)爲一個塊流進行處理(lǐ)。文(wén)件不會(huì)随意查找。如果給定,fileobj可能(néng)是任何具有read()或write()方法的對(duì)象 (取決于模式)。bufsize 指定塊大(dà)小(xiǎo),默認爲字節。将此變體與例如套接字文(wén)件對(duì)象或磁帶設備結合使用(yòng)。但(dàn)是,這(zhè)樣的對(duì)象是有限的,因爲它不允許随機訪問,請(qǐng)參閱示例。目前可能(néng)的模式:20 * 512sys.stdinTarFile

模式

行動

'r|*'

透明(míng)壓縮打開(kāi)一個tar塊流供閱讀。

'r|'

打開(kāi)一個未壓縮的焦油塊流供閱讀。

'r|gz'

打開(kāi)一個gzip壓縮流供閱讀。

'r|bz2'

打開(kāi)一個bzip2壓縮流供閱讀。

'r|xz'

打開(kāi)一個lzma壓縮流供閱讀。

'w|'

寫一個未壓縮的流。

'w|gz'

打開(kāi)gzip壓縮流進行寫入。

'w|bz2'

打開(kāi)一個bzip2壓縮流進行寫入。

'w|xz'

打開(kāi)一個lzma壓縮流進行寫入。

類tarfile.TarFile

閱讀和(hé)編寫tar檔案的類。不要直接使用(yòng)這(zhè)個類:tarfile.open()改爲使用(yòng)。請(qǐng)參閱TarFile對(duì)象。

tarfile.is_tarfile(名字)

True如果名稱是一個tar檔案文(wén)件,則返回該tarfile 模塊可以讀取的内容。

該tarfile模塊定義了(le)以下(xià)例外(wài)情況:

異常tarfile.TarError

所有tarfile例外(wài)的基類。

異常tarfile.ReadError

當tar檔案被打開(kāi)時(shí)引發,或者不能(néng)被tarfile模塊處理(lǐ) 或者以某種方式無效。

異常tarfile.CompressionError

當不支持壓縮方法或無法正确解碼數據時(shí)引發。

異常tarfile.StreamError

針對(duì)流式TarFile 物體的典型局限性而提出。

異常tarfile.ExtractError

在使用(yòng)時(shí)引發非緻命錯誤TarFile.extract(),但(dàn)僅 在使用(yòng)時(shí)引發。TarFile.errorlevel== 2

異常tarfile.HeaderError

TarInfo.frombuf()如果獲取的緩沖區(qū)無效,則會(huì)引發此問題。

以下(xià)常量在模塊級别可用(yòng):

tarfile.ENCODING

默認字符編碼:'utf-8'在Windows上(shàng),sys.getfilesystemencoding()否則返回值 。

以下(xià)每個常量都定義了(le)tarfile模塊能(néng)夠創建的tar歸檔格式 。有關詳細信息,請(qǐng)參閱支持的焦油格式部分

tarfile.USTAR_FORMAT

POSIX.1-1988(ustar)格式。

tarfile.GNU_FORMAT

GNU tar格式。

tarfile.PAX_FORMAT

POSIX.1-2001(pax)格式。

tarfile.DEFAULT_FORMAT

創建檔案的默認格式。這(zhè)是目前GNU_FORMAT。

另請(qǐng)參閱

模 zipfilezipfile标準模塊的文(wén)檔。歸檔操作(zuò)由标準shutil模塊提供的更高(gāo)級歸檔工(gōng)具的文(wén)檔。GNU tar手冊,基本Tar格式tar歸檔文(wén)件的文(wén)檔,包括GNU tar擴展。

TarFile對(duì)象

該TarFile對(duì)象提供了(le)一個tar檔案的接口。tar檔案是一系列塊。一個檔案成員(一個存儲文(wén)件)由一個頭塊和(hé)數據塊組成。可以将文(wén)件存儲在tar歸檔文(wén)件中多次。每個存檔成員都由一個TarInfo 對(duì)象表示,有關詳細信息,請(qǐng)參閱TarInfo對(duì)象。

一個TarFile對(duì)象可以在with 語句中用(yòng)作(zuò)上(shàng)下(xià)文(wén)管理(lǐ)器。塊完成後它會(huì)自(zì)動關閉。請(qǐng)注意,如果發生例外(wài)情況,開(kāi)放(fàng)撰寫的檔案将不會(huì)最終确定; 隻有内部使用(yòng)的文(wén)件對(duì)象将被關閉。有關用(yòng)例,請(qǐng)參閱 示例部分。

3.2版新增功能(néng):增加了(le)對(duì)上(shàng)下(xià)文(wén)管理(lǐ)協議(yì)的支持。

類tarfile.TarFile(名=無,模式= 'R',FileObj文(wén)件=無,格式= DEFAULT_FORMAT,tarinfo = TarInfo,解除引用(yòng)=假,ignore_zeros =假,編碼= ENCODING,誤差= 'surrogateescape',pax_headers =無,調試= 0,errorlevel = 0)

以下(xià)所有參數都是可選的,并且可以作(zuò)爲實例屬性來(lái)訪問。

name是存檔的路徑名。名稱可能(néng)是一個類似于路徑的對(duì)象。如果給出fileobj,它可以被忽略。在這(zhè)種情況下(xià),如果文(wén)件對(duì)象name存在,則使用(yòng)該文(wén)件對(duì)象的屬性。

模式是'r'從(cóng)現(xiàn)有存檔讀取'a'數據,将數據附加到(dào)現(xiàn)有文(wén)件,'w'創建覆蓋現(xiàn)有文(wén)件的新文(wén)件,或'x'僅在尚不存在的情況下(xià)創建新文(wén)件。

如果給出fileobj,它将用(yòng)于讀取或寫入數據。如果可以确定,模式會(huì)被fileobj的模式覆蓋。将從(cóng)位置0使用(yòng)fileobj。

注意

關閉時(shí)fileobj未TarFile關閉。

格式控制存檔格式。它必須是常量之一 USTAR_FORMAT,GNU_FORMAT或者PAX_FORMAT是在模塊級定義的。

該tarinfo參數可以用(yòng)來(lái)替換缺省TarInfo使用(yòng)不同的一類。

如果解除引用(yòng),則爲False檔案添加符号和(hé)硬鏈接。如果是True,請(qǐng)将目标文(wén)件的内容添加到(dào)存檔中。這(zhè)對(duì)不支持符号鏈接的系統沒有影響。

如果ignore_zeros是False,則将空(kōng)塊視(shì)爲歸檔的結尾。如果是這(zhè)樣True,跳過空(kōng)(和(hé)無效)塊,盡量争取盡可能(néng)多的成員。這(zhè)僅用(yòng)于閱讀級聯或損壞的檔案。

調試可以設置從(cóng)0(無調試消息)到(dào)3(所有調試消息)。消息被寫入sys.stderr。

如果錯誤級别是0,則使用(yòng)時(shí)将忽略所有錯誤TarFile.extract()。不過,在調試啓用(yòng)時(shí),它們在調試輸出中顯示爲錯誤消息。如果1所有緻命錯誤都作(zuò)爲OSError 例外(wài)提出。如果2所有非緻命錯誤都作(zuò)爲TarError 例外(wài)提出。

該編碼和(hé)錯誤參數定義用(yòng)于讀取或寫入檔案,以及如何轉換錯誤将要處理(lǐ)的字符編碼。默認設置适用(yòng)于大(dà)多數用(yòng)戶。有關詳細信息,請(qǐng)參閱Unicode問題部分。

所述pax_headers參數是将要添加作(zuò)爲PAX全局頭如果串的一個可選的字典的格式是PAX_FORMAT。

在3.2版本中更改:使用(yòng)'surrogateescape'作(zuò)爲默認的錯誤說法。

改變在3.5版本:将'x'加入(獨家創作(zuò))模式。

改變在3.6版本:該名稱參數接受路徑狀物體。

classmethodTarFile.open(...)

替代構造函數。這(zhè)個tarfile.open()函數實際上(shàng)是這(zhè)個classmethod的一個捷徑。

TarFile.getmember(名字)

返回一個TarInfo成員名稱的對(duì)象。如果在存檔中找不到(dào)名稱,KeyError則會(huì)提出。

注意

如果一個成員在存檔中多次出現(xiàn),則認爲其最後一次出現(xiàn)是最新的版本。

TarFile.getmembers()

将檔案成員作(zuò)爲TarInfo對(duì)象列表返回。該列表與歸檔中的成員具有相同的順序。

TarFile.getnames()

返回成員名單。它與返回的列表具有相同的順序getmembers()。

TarFile.list(verbose = True,*,members = None)

打印目錄到(dào)sys.stdout。如果詳細是False,則僅打印成員的名稱。如果是True,則産生與ls -l類似的輸出。如果給出可選成員,它必須是返回列表的子集getmembers()。

版本3.5中已更改:添加了(le)成員參數。

TarFile.next()

TarInfo當TarFile打開(kāi)閱讀時(shí),将檔案的下(xià)一個成員作(zuò)爲對(duì)象 返回。None如果沒有更多可用(yòng),則返回。

TarFile.extractall(path =“。”,members = None,*,numeric_owner = False)

将存檔中的所有成員提取到(dào)當前工(gōng)作(zuò)目錄或目錄路徑。如果給出可選成員,它必須是返回列表的子集getmembers()。在提取所有成員之後設置所有者,修改時(shí)間和(hé)權限等目錄信息。這(zhè)樣做是爲了(le)解決兩個問題:每次在其中創建文(wén)件時(shí),都會(huì)重置目錄的修改時(shí)間。而且,如果一個目錄的權限不允許寫入,解壓文(wén)件将失敗。

如果numeric_owner是True,則tarfile中的uid和(hé)gid數字用(yòng)于設置提取文(wén)件的所有者/組。否則,使用(yòng)tarfile中的命名值。

警告

切勿在未事(shì)先檢查的情況下(xià)從(cóng)不受信任的來(lái)源提取檔案。有可能(néng)文(wén)件是在路徑之外(wài)創建的,例如具有"/"以兩個點開(kāi)頭的絕對(duì)文(wén)件名或具有兩個點的文(wén)件名的成員".."。

版本3.5中已更改:添加了(le)numeric_owner參數。

改變在3.6版本:該路徑參數接受路徑狀物體。

TarFile.extract(member,path =“”,set_attrs = True,*,numeric_owner = False)

使用(yòng)其全名将存檔中的成員提取到(dào)當前工(gōng)作(zuò)目錄。其文(wén)件信息盡可能(néng)準确地提取。成員 可能(néng)是文(wén)件名或TarInfo對(duì)象。您可以使用(yòng)路徑指定不同的目錄。路徑可能(néng)是一個類似于路徑的對(duì)象。文(wén)件屬性(owner,mtime,mode)被設置,除非set_attrs爲false。

如果numeric_owner是True,則tarfile中的uid和(hé)gid數字用(yòng)于設置提取文(wén)件的所有者/組。否則,使用(yòng)tarfile中的命名值。

注意

extract()方法不考慮幾個提取問題。在大(dà)多數情況下(xià),您應該考慮使用(yòng)該extractall()方法。

警告

請(qǐng)參閱警告extractall()。

版本3.2中已更改:添加了(le)set_attrs參數。

版本3.5中已更改:添加了(le)numeric_owner參數。

改變在3.6版本:該路徑參數接受路徑狀物體。

TarFile.extractfile(成員)

從(cóng)存檔中提取成員作(zuò)爲文(wén)件對(duì)象。成員可能(néng)是文(wén)件名或TarInfo對(duì)象。如果成員是常規文(wén)件或鏈接,io.BufferedReader則返回一個 對(duì)象。否則,None返回。

版本3.3中更改:返回一個io.BufferedReader對(duì)象。

TarFile.add(name,arcname = None,recursive = True,*,filter = None)

将文(wén)件名添加到(dào)存檔。名稱可以是任何類型的文(wén)件(目錄,fifo,符号鏈接等)。如果給定,則arcname爲檔案中的文(wén)件指定替代名稱。目錄默認遞歸添​​加。這(zhè)可以通過設置遞歸來(lái) 避免False。遞歸按排序順序添加條目。如果給出了(le)過濾器,它應該是一個接受TarInfo對(duì)象參數并返回已更改TarInfo對(duì)象的函數。如果它返回,則 None該TarInfo對(duì)象将從(cóng)檔案中排除。見實施例中的示例。

在版本3.2中更改:添加了(le)過濾器參數。

在版本3.7中更改:遞歸按排序順序添加條目。

TarFile.addfile(tarinfo,fileobj = None)

将TarInfo對(duì)象tarinfo添加到(dào)存檔。如果給出fileobj,它應該是一個二進制文(wén)件,并 tarinfo.size從(cóng)中讀取字節并将其添加到(dào)存檔中。您可以TarInfo直接創建對(duì)象,也(yě)可以使用(yòng)gettarinfo()。

TarFile.gettarinfo(name = None,arcname = None,fileobj = None)

根據現(xiàn)有文(wén)件TarInfo的結果os.stat()或等效項創建一個對(duì)象。該文(wén)件可以按名稱命名,也(yě)可以用(yòng)文(wén)件描述符 指定爲文(wén)件對(duì)象 fileobj。 名稱可能(néng)是一個類似于路徑的對(duì)象。如果給定,arcname爲檔案中的文(wén)件指定替代名稱,否則,該名稱取自(zì)fileobj的 name屬性或名稱參數。該名稱應該是一個文(wén)本字符串。

您可以TarInfo在添加它之前修改其中的一些(xiē)屬性addfile()。如果文(wén)件對(duì)象不是位于文(wén)件開(kāi)頭的普通文(wén)件對(duì)象,則size可能(néng)需要修改等屬性。這(zhè)是對(duì)象的情況,例如GzipFile。的name也(yě)可以被修飾,在這(zhè)種情況下(xià)arcname 可能(néng)是一個虛設字符串。

改變在3.6版本:該名稱參數接受路徑狀物體。

TarFile.close()

關閉TarFile。在寫入模式下(xià),兩個完成零塊被附加到(dào)存檔。

TarFile.pax_headers

包含pax全局标題的鍵值對(duì)的字典。

TarInfo對(duì)象

一個TarInfo對(duì)象表示a中的一個成員TarFile。除了(le)存儲文(wén)件的所有必需屬性(如文(wén)件類型,大(dà)小(xiǎo),時(shí)間,權限,所有者等)之外(wài),它還提供了(le)一些(xiē)有用(yòng)的方法來(lái)确定它的類型。它不包含該文(wén)件的數據本身。

TarInfo對(duì)象由TarFile方法 返回getmember(),getmembers()并且gettarinfo()。

classtarfile.TarInfo(name =“”)

創建一個TarInfo對(duì)象。

classmethodTarInfo.frombuf(buf,encoding,errors)

TarInfo從(cóng)字符串緩沖區(qū)buf創建并返回一個對(duì)象。

HeaderError如果緩沖區(qū)無效則引發。

classmethodTarInfo.fromtarfile(tarfile)

從(cóng)TarFile對(duì)象tarfile中讀取下(xià)一個成員,并将其作(zuò)爲TarInfo對(duì)象返回。

TarInfo.tobuf(format = DEFAULT_FORMAT,encoding = ENCODING,errors ='surrogateescape')

從(cóng)一個TarInfo對(duì)象創建一個字符串緩沖區(qū)。有關參數的信息,請(qǐng)參閱TarFile該類的構造函數。

在3.2版本中更改:使用(yòng)'surrogateescape'作(zuò)爲默認的錯誤說法。

一個TarInfo對(duì)象具有以下(xià)公共數據屬性:

TarInfo.name

檔案成員的名稱。

TarInfo.size

字節大(dà)小(xiǎo)。

TarInfo.mtime

上(shàng)次修改時(shí)間。

TarInfo.mode

權限位。

TarInfo.type

文(wén)件類型。 類型通常是這(zhè)些(xiē)常量之一:REGTYPE, AREGTYPE,LNKTYPE,SYMTYPE,DIRTYPE,FIFOTYPE,CONTTYPE,CHRTYPE,BLKTYPE, GNUTYPE_SPARSE。要TarInfo更方便地确定對(duì)象的類型,請(qǐng)使用(yòng)is*()下(xià)面的方法。

TarInfo.linkname

目标文(wén)件名稱的名稱,它僅存TarInfo在于類型LNKTYPE和(hé)對(duì)象中SYMTYPE。

TarInfo.uid

最初存儲此成員的用(yòng)戶的用(yòng)戶标識。

TarInfo.gid

最初存儲此成員的用(yòng)戶的組ID。

TarInfo.uname

用(yòng)戶名。

TarInfo.gname

團隊名字。

TarInfo.pax_headers

包含關聯的pax擴展标題的鍵值對(duì)的字典。

一個TarInfo對(duì)象還提供了(le)一些(xiē)方便的查詢方法:

TarInfo.isfile()

如果Tarinfo對(duì)象是常規文(wén)件,則返回True。

TarInfo.isreg()

和(hé)isfile()一樣。

TarInfo.isdir()

如果它是目錄,則返回。True

TarInfo.issym()

如果它是符号鏈接,則返回True。

TarInfo.islnk()

如果它是一個硬鏈接,則返回True。

TarInfo.ischr()

如果它是一個字符設備,則返回True。

TarInfo.isblk()

如果它是塊設備則返回True。

TarInfo.isfifo()

如果它是FIFO,則返回True。

TarInfo.isdev()

如果是字符設備,塊設備或FIFO之一,則返回True。

命令行界面

3.4版新增功能(néng)

該tarfile模塊提供了(le)一個簡單的命令行界面來(lái)與tar檔案進行交互。

如果你(nǐ)想創建一個新的tar檔案,在-c 選項後面指定它的名字,然後列出應該包含的文(wén)件名:

$ python -m tarfile -c monty.tar spam.txt eggs.txt

複制

傳遞一個目錄也(yě)是可以接受的:

$ python -m tarfile -c monty.tar life-of-brian_1979/

複制

如果您想将tar歸檔文(wén)件解壓縮到(dào)當前目錄中,請(qǐng)使用(yòng)以下(xià)-e選項:

$ python -m tarfile -e monty.tar

複制

您也(yě)可以通過傳遞目錄名稱将tar歸檔文(wén)件解壓縮到(dào)其他(tā)目錄中:

$ python -m tarfile -e monty.tar other-dir/

複制

有關tar歸檔文(wén)件的列表,請(qǐng)使用(yòng)以下(xià)-l選項:

$ python -m tarfile -l monty.tar

複制

命令行選項

-l<tarfile>--list<tarfile>

列出tarfile中的文(wén)件。

-c<tarfile> <source1> ... <sourceN>--create<tarfile> <source1> ... <sourceN>

從(cóng)源文(wén)件創建tarfile。

-e<tarfile> [<output_dir>]--extract<tarfile> [<output_dir>]

如果未指定output_dir,則将tarfile解壓縮到(dào)當前目錄中。

-t<tarfile>--test<tarfile>

測試tarfile是否有效。

-v,--verbose

詳細輸出。

示例

如何提取整個tar檔案到(dào)當前工(gōng)作(zuò)目錄:

import tarfile

tar = tarfile.open("sample.tar.gz")

tar.extractall()

tar.close()

複制

如何TarFile.extractall()使用(yòng)生成器函數而不是列表提取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()

複制

如何從(cóng)文(wén)件名列表中創建一個未壓縮的tar歸檔文(wén)件:

import tarfile

tar = tarfile.open("sample.tar", "w")

for name in ["foo", "bar", "quux"]:

tar.add(name)

tar.close()

複制

使用(yòng)with聲明(míng)的同一個例子:

import tarfile

with tarfile.open("sample.tar", "w") as tar:

for name in ["foo", "bar", "quux"]:

tar.add(name)

複制

如何讀取gzip壓縮的tar檔案并顯示一些(xiē)成員信息:

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()

複制

如何使用(yòng)以下(xià)過濾器 參數創建歸檔并重置用(yòng)戶信息TarFile.add():

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格式

有三種可以使用(yòng)該tarfile模塊創建的tar格式:

POSIX.1-1988 ustar格式(USTAR_FORMAT)。它支持的文(wén)件名長度最多爲256個字符,鏈接名稱最多爲100個字符。最大(dà)文(wén)件大(dà)小(xiǎo)爲8千兆字節。這(zhè)是一個古老(lǎo)而有限但(dàn)廣泛支持的格式。

GNU tar格式(GNU_FORMAT)。它支持長文(wén)件名和(hé)鏈接名稱,大(dà)于8千兆字節的文(wén)件和(hé)稀疏文(wén)件。它是GNU / Linux系統上(shàng)的事(shì)實标準。tarfile完全支持長名稱的GNU tar擴展,稀疏文(wén)件支持是隻讀的。

POSIX.1-2001 pax格式(PAX_FORMAT)。它是最靈活的格式,幾乎沒有限制。它支持長文(wén)件名和(hé)鏈接名稱,大(dà)文(wén)件和(hé)便攜式存儲路徑名。但(dàn)是,今天并非所有的tar實現(xiàn)都能(néng)夠正确處理(lǐ)pax歸檔。

在PAX格式的擴展現(xiàn)有的ustar格式。它使用(yòng)額外(wài)的頭部來(lái)存儲不能(néng)以其他(tā)方式存儲的信息。有兩種類型的pax頭文(wén)件:擴展頭文(wén)件隻影響後續文(wén)件頭文(wén)件,全局頭文(wén)件對(duì)整個存檔文(wén)件有效并影響所有後續文(wén)件。出于便攜性原因,pax标頭中的所有數據都以UTF-8編碼。

還有一些(xiē)可以讀取但(dàn)不能(néng)創建的tar格式變體:

古代的V7格式。這(zhè)是Unix第七版的第一個tar格式,隻存儲常規文(wén)件和(hé)目錄。名稱不能(néng)超過100個字符,沒有用(yòng)戶/組名稱信息。某些(xiē)檔案在包含非ASCII字符的字段中錯誤計(jì)算(suàn)标題校驗和(hé)。

SunOS tar擴展格式。這(zhè)種格式是POSIX.1-2001 pax格式的變體,但(dàn)不兼容。

5. Unicode問題

tar格式最初被設想爲在磁帶驅動器上(shàng)進行備份,主要側重于保存文(wén)件系統信息。現(xiàn)在,tar檔案通常用(yòng)于文(wén)件分發和(hé)在網絡上(shàng)交換檔案。原始格式(所有其他(tā)格式僅僅是變體)的一個問題是沒有支持不同字符編碼的概念。例如,如果包含非ASCII字符,則在Latin-1系統上(shàng)無法正确讀取在UTF-8系統上(shàng)創建的普通tar歸檔文(wén)件。包含這(zhè)些(xiē)字符的名稱(即文(wén)件名,鏈接名稱,用(yòng)戶/組名稱)将顯示損壞。不幸的是,沒有辦法自(zì)動檢測存檔的編碼。

pax格式旨在解決此問題。它使用(yòng)通用(yòng)字符編碼UTF-8存儲非ASCII名稱。讀取pax歸檔文(wén)件時(shí),這(zhè)些(xiē)UTF-8名稱将轉換爲本地文(wén)件系統的編碼。

unicode轉換的細節由類的編碼和(hé)錯誤關鍵字參數控制TarFile。

編碼的默認值是本地字符編碼。它是從(cóng)sys.getfilesystemencoding()和(hé)推導出來(lái)的sys.getdefaultencoding()。在讀取模式下(xià),編碼專門(mén)用(yòng)于将來(lái)自(zì)pax歸檔的unicode名稱轉換爲本地字符編碼中的字符串。在寫入模式下(xià),使用(yòng)編碼取決于所選的存檔格式。如果PAX_FORMAT包含非ASCII字符的輸入名稱在被存儲爲UTF-8字符串之前需要解碼。除非使用(yòng)unicode對(duì)象作(zuò)爲輸入名稱,否則其他(tā)格式不使用(yòng)編碼。這(zhè)些(xiē)字符串在添加到(dào)存檔之前會(huì)轉換爲8位字符串。

所述誤差參數定義如何字符都被視(shì)爲不能(néng)被轉換,或從(cóng)編碼。可能(néng)的值在Codec Base Classes部分列出。在讀取模式下(xià),還有一個額外(wài)的方案'utf-8',這(zhè)意味着錯誤的字符被UTF-8表示所替代。這(zhè)是默認方案。在寫入模式下(xià),錯誤的默認值是'strict'确保名稱信息不被忽視(shì)。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:數據壓縮 | Data Compression zipfile
上(shàng)一篇:數據壓縮 | Data Compression gzip