該tarfile模塊可(kě)以讀寫tar檔案,包括使用gzip或bz2壓縮的檔案。使用該zipfile模塊讀取或寫入.zip文件,或shutil中的更高級别的函數(shù)。
一(yī)些事實和(hé)數(shù)字:
如(rú)果各個模塊可(kě)用,則讀取和(hé)寫入gzip并bz2壓縮歸檔。
讀/寫支持POSIX.1-1988(ustar)格式。
對GNU tar格式的讀/寫支持,包括長(cháng)名稱和(hé)長(cháng)鏈接擴展,對稀疏擴展的隻讀支持。
讀/寫支持POSIX.1-2001(pax)格式。
2.6版本中的新功能(néng)。
處理目錄,常規文件,硬鏈接,符号鏈接,fifo,字符設備和(hé)塊設備,并能(néng)夠獲取和(hé)恢複文件信息,如(rú)時(shí)間(jiān)戳,訪問(wèn)權限和(hé)所有者。
版本3.3中更改:增加了(le)對lzma壓縮的支持。
tarfile.open(name = None,mode ='r',fileobj = None,bufsize = 10240,** kwargs)
TarFile為(wèi)路徑名稱返回一(yī)個對象。有關TarFile允許的對象和(hé)關鍵字參數(shù)的詳細信息,請(qǐng)參閱TarFile對象。
模式必須是表單的字符串'filemode[:compression]',它默認為(wèi)'r'。以下(xià)是模式組合的完整列表:
模式 | 行(xíng)動 |
---|---|
'r' or 'r:*' | 透明(míng)壓縮打開(kāi)(推薦)。 |
'r:' | 打開(kāi)閱讀專門沒有壓縮。 |
'r:gz' | 用gzip壓縮打開(kāi)。 |
'r:bz2' | 用bzip2壓縮打開(kāi)閱讀。 |
'r:xz' | 打開(kāi)閱讀lzma壓縮。 |
'x' 要(yào)麽 'x:' | 創建一(yī)個tar文件而不壓縮。FileExistsError如(rú)果它已經存在,則引發異常。 |
'x:gz' | 用gzip壓縮創建一(yī)個tar文件。FileExistsError如(rú)果它已經存在,則引發異常。 |
'x:bz2' | 用bzip2壓縮創建一(yī)個tar文件。FileExistsError如(rú)果它已經存在,則引發異常。 |
'x:xz' | 用lzma壓縮創建一(yī)個tar文件。FileExistsError如(rú)果它已經存在,則引發異常。 |
'a' or 'a:' | 打開(kāi)後不需要(yào)壓縮。如(rú)果該文件不存在,則會創建該文件。 |
'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'不可(kě)能(néng)。如(rú)果模式 不适合打開(kāi)某個(壓縮)的文件進行(xíng)讀取,ReadError則會引發。使用模式 'r'來避免這(zhè)種情況。如(rú)果不支持壓縮方法,CompressionError則會引發。
如(rú)果指定了(le)fileobj,那(nà)麽它将用作(zuò) 以二進制模式打開(kāi)的名稱文件對象的替代方案。它應該在位置0。
對于模式'w:gz','r:gz','w:bz2','r:bz2','x:gz', 'x:bz2',tarfile.open()接受關鍵字參數(shù)compresslevel(默認9)來指定該文件的壓縮級别。
對于特殊用途,對于第二格式模式: 'filemode|[compression]'。 tarfile.open()将返回一(yī)個TarFile對象,它将數(shù)據作(zuò)為(wèi)一(yī)個塊流進行(xíng)處理。文件不會随意查找。如(rú)果給定,fileobj可(kě)能(néng)是任何具有read()或write()方法的對象 (取決于模式)。bufsize 指定塊大小,默認為(wèi)字節。将此變體與例如(rú)套接字文件對象或磁帶設備結合使用。但(dàn)是,這(zhè)樣的對象是有限的,因為(wèi)它不允許随機訪問(wèn),請(qǐng)參閱示例。目前可(kě)能(néng)的模式:20 * 512sys.stdinTarFile
模式 | 行(xíng)動 |
---|---|
'r|*' | 透明(míng)壓縮打開(kāi)一(yī)個tar塊流供閱讀。 |
'r|' | 打開(kāi)一(yī)個未壓縮的焦油塊流供閱讀。 |
'r|gz' | 打開(kāi)一(yī)個gzip壓縮流供閱讀。 |
'r|bz2' | 打開(kāi)一(yī)個bzip2壓縮流供閱讀。 |
'r|xz' | 打開(kāi)一(yī)個lzma壓縮流供閱讀。 |
'w|' | 寫一(yī)個未壓縮的流。 |
'w|gz' | 打開(kāi)gzip壓縮流進行(xíng)寫入。 |
'w|bz2' | 打開(kāi)一(yī)個bzip2壓縮流進行(xíng)寫入。 |
'w|xz' | 打開(kāi)一(yī)個lzma壓縮流進行(xíng)寫入。 |
類tarfile.TarFile
閱讀和(hé)編寫tar檔案的類。不要(yào)直接使用這(zhè)個類:tarfile.open()改為(wèi)使用。請(qǐng)參閱TarFile對象。
tarfile.is_tarfile(名字)
True如(rú)果名稱是一(yī)個tar檔案文件,則返回該tarfile 模塊可(kě)以讀取的內(nèi)容。
該tarfile模塊定義了(le)以下(xià)例外(wài)情況:
異常tarfile.TarError
所有tarfile例外(wài)的基類。
異常tarfile.ReadError
當tar檔案被打開(kāi)時(shí)引發,或者不能(néng)被tarfile模塊處理 或者以某種方式無效。
異常tarfile.CompressionError
當不支持壓縮方法或無法正确解碼數(shù)據時(shí)引發。
異常tarfile.StreamError
針對流式TarFile 物(wù)體的典型局限性而提出。
異常tarfile.ExtractError
在使用時(shí)引發非緻命錯誤TarFile.extract(),但(dàn)僅 在使用時(shí)引發。TarFile.errorlevel== 2
異常tarfile.HeaderError
TarInfo.frombuf()如(rú)果獲取的緩沖區(qū)無效,則會引發此問(wèn)題。
以下(xià)常量在模塊級别可(kě)用:
tarfile.ENCODING
默認字符編碼:'utf-8'在Windows上(shàng),sys.getfilesystemencoding()否則返回值 。
以下(xià)每個常量都(dōu)定義了(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标準模塊的文檔。歸檔操作(zuò)由标準shutil模塊提供的更高級歸檔工(gōng)具的文檔。GNU tar手冊,基本Tar格式tar歸檔文件的文檔,包括GNU tar擴展。
TarFile對象
該TarFile對象提供了(le)一(yī)個tar檔案的接口。tar檔案是一(yī)系列塊。一(yī)個檔案成員(yuán)(一(yī)個存儲文件)由一(yī)個頭塊和(hé)數(shù)據塊組成。可(kě)以将文件存儲在tar歸檔文件中多次。每個存檔成員(yuán)都(dōu)由一(yī)個TarInfo 對象表示,有關詳細信息,請(qǐng)參閱TarInfo對象。
一(yī)個TarFile對象可(kě)以在with 語句中用作(zuò)上(shàng)下(xià)文管理器。塊完成後它會自(zì)動關閉。請(qǐng)注意,如(rú)果發生例外(wài)情況,開(kāi)放撰寫的檔案将不會最終确定; 隻有內(nèi)部使用的文件對象将被關閉。有關用例,請(qǐng)參閱 示例部分。
3.2版新增功能(néng):增加了(le)對上(shàng)下(xià)文管理協議(yì)的支持。
類tarfile.TarFile(名=無,模式= 'R',FileObj文件=無,格式= DEFAULT_FORMAT,tarinfo = TarInfo,解除引用=假,ignore_zeros =假,編碼= ENCODING,誤差= 'surrogateescape',pax_headers =無,調試= 0,errorlevel = 0)
以下(xià)所有參數(shù)都(dōu)是可(kě)選的,并且可(kě)以作(zuò)為(wèi)實例屬性來訪問(wèn)。
name是存檔的路徑名。名稱可(kě)能(néng)是一(yī)個類似于路徑的對象。如(rú)果給出fileobj,它可(kě)以被忽略。在這(zhè)種情況下(xià),如(rú)果文件對象name存在,則使用該文件對象的屬性。
模式是'r'從(cóng)現有存檔讀取'a'數(shù)據,将數(shù)據附加到現有文件,'w'創建覆蓋現有文件的新文件,或'x'僅在尚不存在的情況下(xià)創建新文件。
如(rú)果給出fileobj,它将用于讀取或寫入數(shù)據。如(rú)果可(kě)以确定,模式會被fileobj的模式覆蓋。将從(cóng)位置0使用fileobj。
注意
關閉時(shí)fileobj未TarFile關閉。
格式控制存檔格式。它必須是常量之一(yī) USTAR_FORMAT,GNU_FORMAT或者PAX_FORMAT是在模塊級定義的。
該tarinfo參數(shù)可(kě)以用來替換缺省TarInfo使用不同的一(yī)類。
如(rú)果解除引用,則為(wèi)False檔案添加符号和(hé)硬鏈接。如(rú)果是True,請(qǐng)将目标文件的內(nèi)容添加到存檔中。這(zhè)對不支持符号鏈接的系統沒有影響。
如(rú)果ignore_zeros是False,則将空塊視(shì)為(wèi)歸檔的結尾。如(rú)果是這(zhè)樣True,跳(tiào)過空(和(hé)無效)塊,盡量争取盡可(kě)能(néng)多的成員(yuán)。這(zhè)僅用于閱讀級聯或損壞的檔案。
調試可(kě)以設置從(cóng)0(無調試消息)到3(所有調試消息)。消息被寫入sys.stderr。
如(rú)果錯誤級别是0,則使用時(shí)将忽略所有錯誤TarFile.extract()。不過,在調試啓用時(shí),它們在調試輸出中顯示為(wèi)錯誤消息。如(rú)果1所有緻命錯誤都(dōu)作(zuò)為(wèi)OSError 例外(wài)提出。如(rú)果2所有非緻命錯誤都(dōu)作(zuò)為(wèi)TarError 例外(wài)提出。
該編碼和(hé)錯誤參數(shù)定義用于讀取或寫入檔案,以及如(rú)何轉換錯誤将要(yào)處理的字符編碼。默認設置适用于大多數(shù)用戶。有關詳細信息,請(qǐng)參閱Unicode問(wèn)題部分。
所述pax_headers參數(shù)是将要(yào)添加作(zuò)為(wèi)PAX全局頭如(rú)果串的一(yī)個可(kě)選的字典的格式是PAX_FORMAT。
在3.2版本中更改:使用'surrogateescape'作(zuò)為(wèi)默認的錯誤說法。
改變在3.5版本:将'x'加入(獨家創作(zuò))模式。
改變在3.6版本:該名稱參數(shù)接受路徑狀物(wù)體。
classmethodTarFile.open(...)
替代構造函數(shù)。這(zhè)個tarfile.open()函數(shù)實際上(shàng)是這(zhè)個classmethod的一(yī)個捷徑。
TarFile.getmember(名字)
返回一(yī)個TarInfo成員(yuán)名稱的對象。如(rú)果在存檔中找不到名稱,KeyError則會提出。
注意
如(rú)果一(yī)個成員(yuán)在存檔中多次出現,則認為(wèi)其最後一(yī)次出現是最新的版本。
TarFile.getmembers()
将檔案成員(yuán)作(zuò)為(wèi)TarInfo對象列表返回。該列表與歸檔中的成員(yuán)具有相同的順序。
TarFile.getnames()
返回成員(yuán)名單。它與返回的列表具有相同的順序getmembers()。
TarFile.list(verbose = True,*,members = None)
打印目錄到sys.stdout。如(rú)果詳細是False,則僅打印成員(yuán)的名稱。如(rú)果是True,則産生與ls -l類似的輸出。如(rú)果給出可(kě)選成員(yuán),它必須是返回列表的子集getmembers()。
版本3.5中已更改:添加了(le)成員(yuán)參數(shù)。
TarFile.next()
TarInfo當TarFile打開(kāi)閱讀時(shí),将檔案的下(xià)一(yī)個成員(yuán)作(zuò)為(wèi)對象 返回。None如(rú)果沒有更多可(kě)用,則返回。
TarFile.extractall(path =“。”,members = None,*,numeric_owner = False)
将存檔中的所有成員(yuán)提取到當前工(gōng)作(zuò)目錄或目錄路徑。如(rú)果給出可(kě)選成員(yuán),它必須是返回列表的子集getmembers()。在提取所有成員(yuán)之後設置所有者,修改時(shí)間(jiān)和(hé)權限等目錄信息。這(zhè)樣做(zuò)是為(wèi)了(le)解決兩個問(wèn)題:每次在其中創建文件時(shí),都(dōu)會重置目錄的修改時(shí)間(jiān)。而且,如(rú)果一(yī)個目錄的權限不允許寫入,解壓文件将失敗。
如(rú)果numeric_owner是True,則tarfile中的uid和(hé)gid數(shù)字用于設置提取文件的所有者/組。否則,使用tarfile中的命名值。
警告
切勿在未事先檢查的情況下(xià)從(cóng)不受信任的來源提取檔案。有可(kě)能(néng)文件是在路徑之外(wài)創建的,例如(rú)具有"/"以兩個點開(kāi)頭的絕對文件名或具有兩個點的文件名的成員(yuán)".."。
版本3.5中已更改:添加了(le)numeric_owner參數(shù)。
改變在3.6版本:該路徑參數(shù)接受路徑狀物(wù)體。
TarFile.extract(member,path =“”,set_attrs = True,*,numeric_owner = False)
使用其全名将存檔中的成員(yuán)提取到當前工(gōng)作(zuò)目錄。其文件信息盡可(kě)能(néng)準确地(dì)提取。成員(yuán) 可(kě)能(néng)是文件名或TarInfo對象。您可(kě)以使用路徑指定不同的目錄。路徑可(kě)能(néng)是一(yī)個類似于路徑的對象。文件屬性(owner,mtime,mode)被設置,除非set_attrs為(wèi)false。
如(rú)果numeric_owner是True,則tarfile中的uid和(hé)gid數(shù)字用于設置提取文件的所有者/組。否則,使用tarfile中的命名值。
注意
extract()方法不考慮幾個提取問(wèn)題。在大多數(shù)情況下(xià),您應該考慮使用該extractall()方法。
警告
請(qǐng)參閱警告extractall()。
版本3.2中已更改:添加了(le)set_attrs參數(shù)。
版本3.5中已更改:添加了(le)numeric_owner參數(shù)。
改變在3.6版本:該路徑參數(shù)接受路徑狀物(wù)體。
TarFile.extractfile(成員(yuán))
從(cóng)存檔中提取成員(yuán)作(zuò)為(wèi)文件對象。成員(yuán)可(kě)能(néng)是文件名或TarInfo對象。如(rú)果成員(yuán)是常規文件或鏈接,io.BufferedReader則返回一(yī)個 對象。否則,None返回。
版本3.3中更改:返回一(yī)個io.BufferedReader對象。
TarFile.add(name,arcname = None,recursive = True,*,filter = None)
将文件名添加到存檔。名稱可(kě)以是任何類型的文件(目錄,fifo,符号鏈接等)。如(rú)果給定,則arcname為(wèi)檔案中的文件指定替代名稱。目錄默認遞歸添加。這(zhè)可(kě)以通(tōng)過設置遞歸來 避免False。遞歸按排序順序添加條目。如(rú)果給出了(le)過濾器,它應該是一(yī)個接受TarInfo對象參數(shù)并返回已更改TarInfo對象的函數(shù)。如(rú)果它返回,則 None該TarInfo對象将從(cóng)檔案中排除。見(jiàn)實施例中的示例。
在版本3.2中更改:添加了(le)過濾器參數(shù)。
在版本3.7中更改:遞歸按排序順序添加條目。
TarFile.addfile(tarinfo,fileobj = None)
将TarInfo對象tarinfo添加到存檔。如(rú)果給出fileobj,它應該是一(yī)個二進制文件,并 tarinfo.size從(cóng)中讀取字節并将其添加到存檔中。您可(kě)以TarInfo直接創建對象,也可(kě)以使用gettarinfo()。
TarFile.gettarinfo(name = None,arcname = None,fileobj = None)
根據現有文件TarInfo的結果os.stat()或等效項創建一(yī)個對象。該文件可(kě)以按名稱命名,也可(kě)以用文件描述符 指定為(wèi)文件對象 fileobj。 名稱可(kě)能(néng)是一(yī)個類似于路徑的對象。如(rú)果給定,arcname為(wèi)檔案中的文件指定替代名稱,否則,該名稱取自(zì)fileobj的 name屬性或名稱參數(shù)。該名稱應該是一(yī)個文本字符串。
您可(kě)以TarInfo在添加它之前修改其中的一(yī)些屬性addfile()。如(rú)果文件對象不是位于文件開(kāi)頭的普通(tōng)文件對象,則size可(kě)能(néng)需要(yào)修改等屬性。這(zhè)是對象的情況,例如(rú)GzipFile。的name也可(kě)以被修飾,在這(zhè)種情況下(xià)arcname 可(kě)能(néng)是一(yī)個虛設字符串。
改變在3.6版本:該名稱參數(shù)接受路徑狀物(wù)體。
TarFile.close()
關閉TarFile。在寫入模式下(xià),兩個完成零塊被附加到存檔。
TarFile.pax_headers
包含pax全局标題的鍵值對的字典。
TarInfo對象
一(yī)個TarInfo對象表示a中的一(yī)個成員(yuán)TarFile。除了(le)存儲文件的所有必需屬性(如(rú)文件類型,大小,時(shí)間(jiān),權限,所有者等)之外(wài),它還提供了(le)一(yī)些有用的方法來确定它的類型。它不包含該文件的數(shù)據本身。
TarInfo對象由TarFile方法 返回getmember(),getmembers()并且gettarinfo()。
classtarfile.TarInfo(name =“”)
創建一(yī)個TarInfo對象。
classmethodTarInfo.frombuf(buf,encoding,errors)
TarInfo從(cóng)字符串緩沖區(qū)buf創建并返回一(yī)個對象。
HeaderError如(rú)果緩沖區(qū)無效則引發。
classmethodTarInfo.fromtarfile(tarfile)
從(cóng)TarFile對象tarfile中讀取下(xià)一(yī)個成員(yuán),并将其作(zuò)為(wèi)TarInfo對象返回。
TarInfo.tobuf(format = DEFAULT_FORMAT,encoding = ENCODING,errors ='surrogateescape')
從(cóng)一(yī)個TarInfo對象創建一(yī)個字符串緩沖區(qū)。有關參數(shù)的信息,請(qǐng)參閱TarFile該類的構造函數(shù)。
在3.2版本中更改:使用'surrogateescape'作(zuò)為(wèi)默認的錯誤說法。
一(yī)個TarInfo對象具有以下(xià)公共數(shù)據屬性:
TarInfo.name
檔案成員(yuán)的名稱。
TarInfo.size
字節大小。
TarInfo.mtime
上(shàng)次修改時(shí)間(jiān)。
TarInfo.mode
權限位。
TarInfo.type
文件類型。 類型通(tōng)常是這(zhè)些常量之一(yī):REGTYPE, AREGTYPE,LNKTYPE,SYMTYPE,DIRTYPE,FIFOTYPE,CONTTYPE,CHRTYPE,BLKTYPE, GNUTYPE_SPARSE。要(yào)TarInfo更方便地(dì)确定對象的類型,請(qǐng)使用is*()下(xià)面的方法。
TarInfo.linkname
目标文件名稱的名稱,它僅存TarInfo在于類型LNKTYPE和(hé)對象中SYMTYPE。
TarInfo.uid
最初存儲此成員(yuán)的用戶的用戶标識。
TarInfo.gid
最初存儲此成員(yuán)的用戶的組ID。
TarInfo.uname
用戶名。
TarInfo.gname
團隊名字。
TarInfo.pax_headers
包含關聯的pax擴展标題的鍵值對的字典。
一(yī)個TarInfo對象還提供了(le)一(yī)些方便的查詢方法:
TarInfo.isfile()
如(rú)果Tarinfo對象是常規文件,則返回True。
TarInfo.isreg()
和(hé)isfile()一(yī)樣。
TarInfo.isdir()
如(rú)果它是目錄,則返回。True
TarInfo.issym()
如(rú)果它是符号鏈接,則返回True。
TarInfo.islnk()
如(rú)果它是一(yī)個硬鏈接,則返回True。
TarInfo.ischr()
如(rú)果它是一(yī)個字符設備,則返回True。
TarInfo.isblk()
如(rú)果它是塊設備則返回True。
TarInfo.isfifo()
如(rú)果它是FIFO,則返回True。
TarInfo.isdev()
如(rú)果是字符設備,塊設備或FIFO之一(yī),則返回True。
命令行(xíng)界面
3.4版新增功能(néng)
該tarfile模塊提供了(le)一(yī)個簡單的命令行(xíng)界面來與tar檔案進行(xíng)交互。
如(rú)果你想創建一(yī)個新的tar檔案,在-c 選項後面指定它的名字,然後列出應該包含的文件名:
$ python -m tarfile -c monty.tar spam.txt eggs.txt
複制
傳遞一(yī)個目錄也是可(kě)以接受的:
$ python -m tarfile -c monty.tar life-of-brian_1979/
複制
如(rú)果您想将tar歸檔文件解壓縮到當前目錄中,請(qǐng)使用以下(xià)-e選項:
$ python -m tarfile -e monty.tar
複制
您也可(kě)以通(tōng)過傳遞目錄名稱将tar歸檔文件解壓縮到其他(tā)目錄中:
$ python -m tarfile -e monty.tar other-dir/
複制
有關tar歸檔文件的列表,請(qǐng)使用以下(xià)-l選項:
$ python -m tarfile -l monty.tar
複制
命令行(xíng)選項
-l<tarfile>--list<tarfile>
列出tarfile中的文件。
-c<tarfile> <source1> ... <sourceN>--create<tarfile> <source1> ... <sourceN>
從(cóng)源文件創建tarfile。
-e<tarfile> [<output_dir>]--extract<tarfile> [<output_dir>]
如(rú)果未指定output_dir,則将tarfile解壓縮到當前目錄中。
-t<tarfile>--test<tarfile>
測試tarfile是否有效。
-v,--verbose
詳細輸出。
示例
如(rú)何提取整個tar檔案到當前工(gōng)作(zuò)目錄:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
複制
如(rú)何TarFile.extractall()使用生成器函數(shù)而不是列表提取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()
複制
如(rú)何從(cóng)文件名列表中創建一(yī)個未壓縮的tar歸檔文件:
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
tar.add(name)
tar.close()
複制
使用with聲明(míng)的同一(yī)個例子:
import tarfile
with tarfile.open("sample.tar", "w") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
複制
如(rú)何讀取gzip壓縮的tar檔案并顯示一(yī)些成員(yuán)信息:
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()
複制
如(rú)何使用以下(xià)過濾器 參數(shù)創建歸檔并重置用戶信息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格式
有三種可(kě)以使用該tarfile模塊創建的tar格式:
POSIX.1-1988 ustar格式(USTAR_FORMAT)。它支持的文件名長(cháng)度最多為(wèi)256個字符,鏈接名稱最多為(wèi)100個字符。最大文件大小為(wèi)8千兆字節。這(zhè)是一(yī)個古老(lǎo)而有限但(dàn)廣泛支持的格式。
GNU tar格式(GNU_FORMAT)。它支持長(cháng)文件名和(hé)鏈接名稱,大于8千兆字節的文件和(hé)稀疏文件。它是GNU / Linux系統上(shàng)的事實标準。tarfile完全支持長(cháng)名稱的GNU tar擴展,稀疏文件支持是隻讀的。
POSIX.1-2001 pax格式(PAX_FORMAT)。它是最靈活的格式,幾乎沒有限制。它支持長(cháng)文件名和(hé)鏈接名稱,大文件和(hé)便攜式存儲路徑名。但(dàn)是,今天并非所有的tar實現都(dōu)能(néng)夠正确處理pax歸檔。
在PAX格式的擴展現有的ustar格式。它使用額外(wài)的頭部來存儲不能(néng)以其他(tā)方式存儲的信息。有兩種類型的pax頭文件:擴展頭文件隻影響後續文件頭文件,全局頭文件對整個存檔文件有效并影響所有後續文件。出于便攜性原因,pax标頭中的所有數(shù)據都(dōu)以UTF-8編碼。
還有一(yī)些可(kě)以讀取但(dàn)不能(néng)創建的tar格式變體:
古代的V7格式。這(zhè)是Unix第七版的第一(yī)個tar格式,隻存儲常規文件和(hé)目錄。名稱不能(néng)超過100個字符,沒有用戶/組名稱信息。某些檔案在包含非ASCII字符的字段中錯誤計算标題校驗和(hé)。
SunOS tar擴展格式。這(zhè)種格式是POSIX.1-2001 pax格式的變體,但(dàn)不兼容。
5. Unicode問(wèn)題
tar格式最初被設想為(wèi)在磁帶驅動器上(shàng)進行(xíng)備份,主要(yào)側重于保存文件系統信息。現在,tar檔案通(tōng)常用于文件分發和(hé)在網絡上(shàng)交換檔案。原始格式(所有其他(tā)格式僅僅是變體)的一(yī)個問(wèn)題是沒有支持不同字符編碼的概念。例如(rú),如(rú)果包含非ASCII字符,則在Latin-1系統上(shàng)無法正确讀取在UTF-8系統上(shàng)創建的普通(tōng)tar歸檔文件。包含這(zhè)些字符的名稱(即文件名,鏈接名稱,用戶/組名稱)将顯示損壞。不幸的是,沒有辦法自(zì)動檢測存檔的編碼。
pax格式旨在解決此問(wèn)題。它使用通(tōng)用字符編碼UTF-8存儲非ASCII名稱。讀取pax歸檔文件時(shí),這(zhè)些UTF-8名稱将轉換為(wèi)本地(dì)文件系統的編碼。
unicode轉換的細節由類的編碼和(hé)錯誤關鍵字參數(shù)控制TarFile。
編碼的默認值是本地(dì)字符編碼。它是從(cóng)sys.getfilesystemencoding()和(hé)推導出來的sys.getdefaultencoding()。在讀取模式下(xià),編碼專門用于将來自(zì)pax歸檔的unicode名稱轉換為(wèi)本地(dì)字符編碼中的字符串。在寫入模式下(xià),使用編碼取決于所選的存檔格式。如(rú)果PAX_FORMAT包含非ASCII字符的輸入名稱在被存儲為(wèi)UTF-8字符串之前需要(yào)解碼。除非使用unicode對象作(zuò)為(wèi)輸入名稱,否則其他(tā)格式不使用編碼。這(zhè)些字符串在添加到存檔之前會轉換為(wèi)8位字符串。
所述誤差參數(shù)定義如(rú)何字符都(dōu)被視(shì)為(wèi)不能(néng)被轉換,或從(cóng)編碼。可(kě)能(néng)的值在Codec Base Classes部分列出。在讀取模式下(xià),還有一(yī)個額外(wài)的方案'utf-8',這(zhè)意味着錯誤的字符被UTF-8表示所替代。這(zhè)是默認方案。在寫入模式下(xià),錯誤的默認值是'strict'确保名稱信息不被忽視(shì)。
網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發