13.6. tarfile — tarアーカイブファイルの読み取りと書き込み—Pythonドキュメント
13.6。 tarfile —tarアーカイブファイルの読み取りと書き込み
ソースコード: :source: `Lib / tarfile.py`
tarfile モジュールを使用すると、gzip、bz2、およびlzma圧縮を使用するアーカイブを含むtarアーカイブの読み取りと書き込みが可能になります。 zipfile モジュールを使用して、.zip
ファイル、または shutil の上位関数を読み書きします。
いくつかの事実と数字:
- gzip 、 bz2 、および lzma の圧縮アーカイブ(それぞれのモジュールが使用可能な場合)の読み取りと書き込み。
- POSIX.1-1988(ustar)形式の読み取り/書き込みサポート。
- longname および longlink 拡張機能を含むGNUtar形式の読み取り/書き込みサポート、スパースファイルの復元を含む sparse 拡張機能のすべてのバリアントの読み取り専用サポート。
- POSIX.1-2001(pax)形式の読み取り/書き込みサポート。
- ディレクトリ、通常のファイル、ハードリンク、シンボリックリンク、FIFO、文字デバイス、ブロックデバイスを処理し、タイムスタンプ、アクセス許可、所有者などのファイル情報を取得および復元できます。
バージョン3.3で変更: lzma 圧縮のサポートが追加されました。
- tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, \*\*kwargs)
パス名 name の TarFile オブジェクトを返します。 TarFile オブジェクトと許可されるキーワード引数の詳細については、 TarFileオブジェクトを参照してください。
mode は、
'filemode[:compression]'
の形式の文字列である必要があり、デフォルトは'r'
です。 モードの組み合わせの完全なリストは次のとおりです。モード
アクション
'r' or 'r:*'
透過圧縮で読むために開きます(推奨)。
'r:'
圧縮せずに排他的に読むために開きます。
'r:gz'
gzip圧縮で読むために開きます。
'r:bz2'
bzip2圧縮で読むために開きます。
'r:xz'
lzma圧縮で読むために開きます。
'x'
または'x:'
圧縮せずにtarfileを排他的に作成します。 FileExistsError 例外がすでに存在する場合は、それを発生させます。
'x:gz'
gzip圧縮でtarfileを作成します。 FileExistsError 例外がすでに存在する場合は、それを発生させます。
'x:bz2'
bzip2圧縮でtarfileを作成します。 FileExistsError 例外がすでに存在する場合は、それを発生させます。
'x:xz'
lzma圧縮を使用してtarfileを作成します。 FileExistsError 例外がすでに存在する場合は、それを発生させます。
'a' or 'a:'
圧縮せずに追加するために開きます。 ファイルが存在しない場合は作成されます。
'w' or 'w:'
非圧縮書き込み用に開きます。
'w:gz'
gzip圧縮書き込み用に開きます。
'w:bz2'
bzip2圧縮書き込み用に開きます。
'w:xz'
lzma圧縮書き込み用に開きます。
'a:gz'
、'a:bz2'
、または'a:xz'
は使用できないことに注意してください。 モードが特定の(圧縮された)ファイルを読み取り用に開くのに適していない場合、 ReadError が発生します。 これを回避するには、モード'r'
を使用してください。 圧縮方法がサポートされていない場合、 CompressionError が発生します。fileobj が指定されている場合、 name のバイナリモードで開かれた fileオブジェクトの代わりに使用されます。 位置0にあるはずです。
モード
'w:gz'
、'r:gz'
、'w:bz2'
、'r:bz2'
、'x:gz'
、'x:bz2'
、 tarfile.openの場合()は、キーワード引数 compresslevel (デフォルトは9
)を受け入れて、ファイルの圧縮レベルを指定します。特別な目的のために、モードの2番目のフォーマットがあります:
'filemode|[compression]'
。 tarfile.open()は、データをブロックのストリームとして処理する TarFile オブジェクトを返します。 ファイルに対してランダムなシークは行われません。 指定した場合、 fileobj は、read()
またはwrite()
メソッド(モードに応じて)を持つ任意のオブジェクトです。 bufsize はブロックサイズを指定し、デフォルトは20 * 512
バイトです。 このバリアントを例と組み合わせて使用しますsys.stdin
、ソケットファイルオブジェクトまたはテープデバイス。 ただし、このような TarFile オブジェクトは、ランダムアクセスを許可しないという制限があります。例を参照してください。 現在可能なモード:モード
アクション
*' 透過圧縮で読み取るために、tarブロックのストリームを開きます。
' 読み取り用に非圧縮タールブロックのストリームを開きます。
gz' 読み取り用にgzip圧縮されたストリームを開きます。
bz2' 読み取り用にbzip2圧縮ストリームを開きます。
xz' 読み取り用にlzma圧縮ストリームを開きます。
' 書き込み用に非圧縮のストリームを開きます。
gz' 書き込み用にgzip圧縮されたストリームを開きます。
bz2' 書き込み用にbzip2圧縮ストリームを開きます。
xz' 書き込み用にlzma圧縮ストリームを開きます。
バージョン3.5で変更:
'x'
(排他的作成)モードが追加されました。バージョン3.6で変更: name パラメーターは、パスのようなオブジェクトを受け入れます。
- class tarfile.TarFile
- tarアーカイブを読み書きするためのクラス。 このクラスを直接使用しないでください。代わりに tarfile.open()を使用してください。 TarFileオブジェクトを参照してください。
tarfile モジュールは、次の例外を定義します。
- exception tarfile.TarError
- すべての tarfile 例外の基本クラス。
- exception tarfile.ReadError
- tarアーカイブが開かれると発生します。これは、 tarfile モジュールで処理できないか、何らかの理由で無効です。
- exception tarfile.CompressionError
- 圧縮方法がサポートされていない場合、またはデータを適切にデコードできない場合に発生します。
- exception tarfile.StreamError
- ストリームのような TarFile オブジェクトに典型的な制限のために発生します。
- exception tarfile.ExtractError
- TarFile.extract()を使用しているときに、致命的でないエラーに対して発生しますが、
TarFile.errorlevel
== 2
の場合のみです。
- exception tarfile.HeaderError
- 取得するバッファが無効な場合、 TarInfo.frombuf()によって発生します。
モジュールレベルでは、次の定数を使用できます。
- tarfile.ENCODING
- デフォルトの文字エンコード:Windowsでは
'utf-8'
、それ以外の場合は sys.getfilesystemencoding()によって返される値。
次の各定数は、 tarfile モジュールが作成できるtarアーカイブ形式を定義します。 詳細については、セクションサポートされているtar形式を参照してください。
- tarfile.USTAR_FORMAT
- POSIX.1-1988(ustar)形式。
- tarfile.GNU_FORMAT
- GNUtar形式。
- tarfile.PAX_FORMAT
- POSIX.1-2001(pax)形式。
- tarfile.DEFAULT_FORMAT
- アーカイブを作成するためのデフォルトの形式。 これは現在 GNU_FORMAT です。
も参照してください
- モジュール zipfile
- zipfile 標準モジュールのドキュメント。
- アーカイブ操作
- 標準の shutil モジュールによって提供される高レベルのアーカイブ機能のドキュメント。
- GNU tarマニュアル、基本的なtar形式
- GNUtar拡張機能を含むtarアーカイブファイルのドキュメント。
13.6.1。 TarFileオブジェクト
TarFile オブジェクトは、tarアーカイブへのインターフェイスを提供します。 tarアーカイブは一連のブロックです。 アーカイブメンバー(保存されたファイル)は、ヘッダーブロックとそれに続くデータブロックで構成されます。 ファイルをtarアーカイブに複数回保存することができます。 各アーカイブメンバーは、 TarInfo オブジェクトで表されます。詳細については、 TarInfoオブジェクトを参照してください。
TarFile オブジェクトは、 with ステートメントのコンテキストマネージャーとして使用できます。 ブロックが完了すると、自動的に閉じられます。 例外が発生した場合、書き込み用に開かれたアーカイブはファイナライズされないことに注意してください。 内部で使用されているファイルオブジェクトのみが閉じられます。 使用例については、例セクションを参照してください。
バージョン3.2の新機能:コンテキスト管理プロトコルのサポートが追加されました。
- 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)
以下のすべての引数はオプションであり、インスタンス属性としてもアクセスできます。
name はアーカイブのパス名です。 name は path-likeオブジェクトである可能性があります。 fileobj が指定されている場合は、省略できます。 この場合、ファイルオブジェクトの
name
属性が存在する場合はそれが使用されます。モードは、既存のアーカイブから読み取る
'r'
、既存のファイルにデータを追加する'a'
、既存のファイルを上書きする新しいファイルを作成する'w'
のいずれかです。 1つ、または'x'
を使用して、新しいファイルがまだ存在しない場合にのみ作成します。fileobj を指定すると、データの読み取りまたは書き込みに使用されます。 判別できる場合は、モードが fileobj のモードで上書きされます。 fileobj は位置0から使用されます。
ノート
TarFile が閉じている場合、 fileobj は閉じられません。
format はアーカイブフォーマットを制御します。 モジュールレベルで定義されている定数 USTAR_FORMAT 、 GNU_FORMAT 、または PAX_FORMAT のいずれかである必要があります。
tarinfo 引数を使用して、デフォルトの TarInfo クラスを別のクラスに置き換えることができます。
dereference が False の場合、アーカイブにシンボリックリンクとハードリンクを追加します。 True の場合は、ターゲットファイルのコンテンツをアーカイブに追加します。 これは、シンボリックリンクをサポートしていないシステムには影響しません。
ignore_zeros が False の場合、空のブロックをアーカイブの終わりとして扱います。 True の場合は、空の(無効な)ブロックをスキップして、できるだけ多くのメンバーを取得するようにしてください。 これは、連結または破損したアーカイブを読み取る場合にのみ役立ちます。
debug は、
0
(デバッグメッセージなし)から3
(すべてのデバッグメッセージ)まで設定できます。 メッセージはsys.stderr
に書き込まれます。errorlevel が
0
の場合、 TarFile.extract()を使用するとすべてのエラーが無視されます。 それでも、デバッグが有効になっている場合は、デバッグ出力にエラーメッセージとして表示されます。1
の場合、すべての fatal エラーは OSError 例外として発生します。2
の場合、すべての致命的でないエラーは、 TarError 例外としても発生します。encoding および errors 引数は、アーカイブの読み取りまたは書き込みに使用される文字エンコードと、変換エラーの処理方法を定義します。 デフォルト設定はほとんどのユーザーで機能します。 詳細については、セクション Unicodeの問題を参照してください。
pax_headers 引数は、 format が PAX_FORMAT の場合、paxグローバルヘッダーとして追加される文字列のオプションの辞書です。
バージョン3.2で変更: エラー引数のデフォルトとして
'surrogateescape'
を使用します。バージョン3.5で変更:
'x'
(排他的作成)モードが追加されました。バージョン3.6で変更: name パラメーターは、パスのようなオブジェクトを受け入れます。
- classmethod TarFile.open(...)
- 代替コンストラクター。 tarfile.open()関数は、実際にはこのクラスメソッドへのショートカットです。
- TarFile.getmember(name)
メンバー name の TarInfo オブジェクトを返します。 name がアーカイブに見つからない場合、 KeyError が発生します。
ノート
メンバーがアーカイブ内で複数回出現する場合、その最後の出現が最新バージョンであると見なされます。
- TarFile.getmembers()
- アーカイブのメンバーを TarInfo オブジェクトのリストとして返します。 リストの順序は、アーカイブのメンバーと同じです。
- TarFile.getnames()
- メンバーを名前のリストとして返します。 getmembers()によって返されるリストと同じ順序です。
- TarFile.list(verbose=True, *, members=None)
sys.stdout
に目次を印刷します。 verbose が False の場合、メンバーの名前のみが出力されます。 True の場合、 ls -l と同様の出力が生成されます。 オプションの members を指定する場合は、 getmembers()によって返されるリストのサブセットである必要があります。バージョン3.5で変更: メンバーパラメーターが追加されました。
- TarFile.next()
- TarFile が読み取り用に開かれている場合、アーカイブの次のメンバーを TarInfo オブジェクトとして返します。 利用可能なものがなくなった場合は、なしを返します。
- TarFile.extractall(path='.', members=None, *, numeric_owner=False)
アーカイブから現在の作業ディレクトリまたはディレクトリパスにすべてのメンバーを抽出します。 オプションの members を指定する場合は、 getmembers()によって返されるリストのサブセットである必要があります。 所有者、変更時間、権限などのディレクトリ情報は、すべてのメンバーが抽出された後に設定されます。 これは、2つの問題を回避するために行われます。ディレクトリにファイルが作成されるたびに、ディレクトリの変更時刻がリセットされます。 また、ディレクトリのアクセス許可で書き込みが許可されていない場合、ディレクトリへのファイルの抽出は失敗します。
numeric_owner が True の場合、tarfileのuid番号とgid番号を使用して、抽出されたファイルの所有者/グループを設定します。 それ以外の場合は、tarfileの名前付き値が使用されます。
警告
事前の検査なしに、信頼できないソースからアーカイブを抽出しないでください。 ファイルがパスの外部で作成される可能性があります。
"/"
で始まる絶対ファイル名または2つのドット".."
で始まるファイル名を持つメンバー。バージョン3.5で変更: numeric_owner パラメーターが追加されました。
バージョン3.6で変更: path パラメーターは、 pathのようなオブジェクトを受け入れます。
- TarFile.extract(member, path=, set_attrs=True, *, numeric_owner=False)
フルネームを使用して、アーカイブから現在の作業ディレクトリにメンバーを抽出します。 そのファイル情報は可能な限り正確に抽出されます。 member は、ファイル名または TarInfo オブジェクトです。 パスを使用して別のディレクトリを指定できます。 パスはパスのようなオブジェクトである可能性があります。 set_attrs がfalseでない限り、ファイル属性(owner、mtime、mode)が設定されます。
numeric_owner が True の場合、tarfileのuid番号とgid番号を使用して、抽出されたファイルの所有者/グループを設定します。 それ以外の場合は、tarfileの名前付き値が使用されます。
ノート
extract()メソッドは、いくつかの抽出の問題を処理しません。 ほとんどの場合、 extractall()メソッドの使用を検討する必要があります。
警告
extractall()の警告を参照してください。
バージョン3.2で変更: set_attrs パラメーターが追加されました。
バージョン3.5で変更: numeric_owner パラメーターが追加されました。
バージョン3.6で変更: path パラメーターは、 pathのようなオブジェクトを受け入れます。
- TarFile.extractfile(member)
アーカイブからメンバーをファイルオブジェクトとして抽出します。 member は、ファイル名または TarInfo オブジェクトです。 member が通常のファイルまたはリンクの場合、 io.BufferedReader オブジェクトが返されます。 それ以外の場合は、 None が返されます。
バージョン3.3で変更: io.BufferedReader オブジェクトを返します。
- TarFile.add(name, arcname=None, recursive=True, exclude=None, *, filter=None)
ファイル name をアーカイブに追加します。 name は、任意のタイプのファイル(ディレクトリ、FIFO、シンボリックリンクなど)にすることができます。 指定した場合、 arcname は、アーカイブ内のファイルの代替名を指定します。 ディレクトリはデフォルトで再帰的に追加されます。 これは、 recursive を False に設定することで回避できます。 exclude が指定されている場合、それは1つのファイル名引数を取り、ブール値を返す関数である必要があります。 この値に応じて、それぞれのファイルが除外( True )または追加( False )されます。 filter を指定する場合は、キーワード引数である必要があります。 TarInfo オブジェクトの引数を取り、変更された TarInfo オブジェクトを返す関数である必要があります。 代わりに None を返す場合、 TarInfo オブジェクトはアーカイブから除外されます。 例については、例を参照してください。
バージョン3.2で変更: filter パラメーターが追加されました。
バージョン3.2以降非推奨: exclude パラメーターは非推奨です。代わりに filter パラメーターを使用してください。
- TarFile.addfile(tarinfo, fileobj=None)
- TarInfo オブジェクト tarinfo をアーカイブに追加します。 fileobj が指定されている場合、それはバイナリファイルである必要があり、
tarinfo.size
バイトがそこから読み取られ、アーカイブに追加されます。 TarInfo オブジェクトを直接作成することも、 gettarinfo()を使用して作成することもできます。
- TarFile.gettarinfo(name=None, arcname=None, fileobj=None)
os.stat()または同等の結果から、既存のファイルに TarInfo オブジェクトを作成します。 ファイルは、 name で名前が付けられるか、ファイル記述子を使用して file object fileobj として指定されます。 name は path-likeオブジェクトである可能性があります。 指定されている場合、 arcname はアーカイブ内のファイルの代替名を指定します。指定されていない場合、名前は fileobj の name 属性またはから取得されます。 ] name 引数。 名前はテキスト文字列である必要があります。
addfile()を使用して追加する前に、 TarInfo の属性の一部を変更できます。 ファイルオブジェクトがファイルの先頭にある通常のファイルオブジェクトでない場合は、 size などの属性を変更する必要があります。 これは、 GzipFile などのオブジェクトの場合です。 name も変更できます。その場合、 arcname はダミー文字列になる可能性があります。
バージョン3.6で変更: name パラメーターは、パスのようなオブジェクトを受け入れます。
- TarFile.close()
- TarFile を閉じます。 書き込みモードでは、2つの終了ゼロブロックがアーカイブに追加されます。
- TarFile.pax_headers
- paxグローバルヘッダーのキーと値のペアを含む辞書。
13.6.2。 TarInfoオブジェクト
TarInfo オブジェクトは、 TarFile の1つのメンバーを表します。 ファイルに必要なすべての属性(ファイルの種類、サイズ、時間、アクセス許可、所有者など)を保存する以外に、ファイルの種類を判別するための便利な方法がいくつか用意されています。 ファイルのデータ自体は含まれていません。
TarInfo オブジェクトは、 TarFile のメソッドgetmember()
、getmembers()
、およびgettarinfo()
によって返されます。
- class tarfile.TarInfo(name=)
- TarInfo オブジェクトを作成します。
- classmethod TarInfo.frombuf(buf, encoding, errors)
文字列バッファ buf から TarInfo オブジェクトを作成して返します。
バッファが無効な場合、 HeaderError を発生させます。
- classmethod TarInfo.fromtarfile(tarfile)
- TarFile オブジェクト tarfile から次のメンバーを読み取り、 TarInfo オブジェクトとして返します。
- TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape')
TarInfo オブジェクトから文字列バッファを作成します。 引数の詳細については、 TarFile クラスのコンストラクターを参照してください。
バージョン3.2で変更: エラー引数のデフォルトとして
'surrogateescape'
を使用します。
TarInfo
オブジェクトには、次のパブリックデータ属性があります。
- TarInfo.name
- アーカイブメンバーの名前。
- TarInfo.size
- バイト単位のサイズ。
- TarInfo.mtime
- 最終変更の時刻。
- TarInfo.mode
- 許可ビット。
- TarInfo.type
- ファイルの種類。 type は通常、次の定数の1つです:
REGTYPE
、AREGTYPE
、LNKTYPE
、SYMTYPE
、DIRTYPE
、[ X104X] 、CONTTYPE
、CHRTYPE
、BLKTYPE
、GNUTYPE_SPARSE
。 TarInfo オブジェクトのタイプをより便利に判別するには、以下のis*()
メソッドを使用します。
- TarInfo.linkname
- タイプ
LNKTYPE
およびSYMTYPE
の TarInfo オブジェクトにのみ存在するターゲットファイル名の名前。
- TarInfo.uid
- このメンバーを最初に保管したユーザーのユーザーID。
- TarInfo.gid
- このメンバーを最初に保存したユーザーのグループID。
- TarInfo.uname
- ユーザー名。
- TarInfo.gname
- グループ名。
- TarInfo.pax_headers
- 関連するpax拡張ヘッダーのキーと値のペアを含む辞書。
TarInfo オブジェクトは、いくつかの便利なクエリメソッドも提供します。
- TarInfo.isfile()
Tarinfo
オブジェクトが通常のファイルの場合、 True を返します。
- TarInfo.isreg()
- isfile()と同じです。
- TarInfo.isdir()
- ディレクトリの場合は True を返します。
- TarInfo.issym()
- シンボリックリンクの場合は True を返します。
- TarInfo.islnk()
- ハードリンクの場合は True を返します。
- TarInfo.ischr()
- キャラクターデバイスの場合は True を返します。
- TarInfo.isblk()
- ブロックデバイスの場合は、 True を返します。
- TarInfo.isfifo()
- FIFOの場合は、 True を返します。
- TarInfo.isdev()
- キャラクターデバイス、ブロックデバイス、FIFOのいずれかである場合は、 True を返します。
13.6.3。 コマンドラインインターフェイス
バージョン3.4の新機能。
tarfile モジュールは、tarアーカイブと対話するためのシンプルなコマンドラインインターフェイスを提供します。
新しいtarアーカイブを作成する場合は、 -c オプションの後にその名前を指定してから、含める必要のあるファイル名をリストします。
$ python -m tarfile -c monty.tar spam.txt eggs.txt
ディレクトリを渡すこともできます。
$ python -m tarfile -c monty.tar life-of-brian_1979/
tarアーカイブを現在のディレクトリに抽出する場合は、 -e オプションを使用します。
$ python -m tarfile -e monty.tar
ディレクトリの名前を渡すことで、tarアーカイブを別のディレクトリに抽出することもできます。
$ python -m tarfile -e monty.tar other-dir/
tarアーカイブ内のファイルのリストについては、 -l オプションを使用してください。
$ python -m tarfile -l monty.tar
13.6.3.1。 コマンドラインオプション
- -l <tarfile>
--list <tarfile>
- tarfile内のファイルを一覧表示します。
- -c <tarfile> <source1> ... <sourceN>
--create <tarfile> <source1> ... <sourceN>
- ソースファイルからtarfileを作成します。
- -e <tarfile> [<output_dir>]
--extract <tarfile> [<output_dir>]
- output_dir が指定されていない場合は、tarfileを現在のディレクトリに抽出します。
- -t <tarfile>
--test <tarfile>
- tarfileが有効かどうかをテストします。
- -v, --verbose
- 冗長出力。
13.6.4。 例
tarアーカイブ全体を現在の作業ディレクトリに抽出する方法:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
リストの代わりにジェネレーター関数を使用して、 TarFile.extractall()で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()
ファイル名のリストから非圧縮のtarアーカイブを作成する方法:
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
tar.add(name)
tar.close()
with ステートメントを使用した同じ例:
import tarfile
with tarfile.open("sample.tar", "w") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
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()
TarFile.add()の filter パラメーターを使用してアーカイブを作成し、ユーザー情報をリセットする方法:
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()
13.6.5。 サポートされているtar形式
tarfile モジュールで作成できるtar形式は3つあります。
POSIX.1-1988 ustar形式( USTAR_FORMAT )。 最大256文字の長さのファイル名と最大100文字のリンク名をサポートします。 最大ファイルサイズは8GiBです。 これは古くて制限されていますが、広くサポートされている形式です。
GNU tar形式( GNU_FORMAT )。 長いファイル名とリンク名、8 GiBを超えるファイル、およびスパースファイルをサポートします。 これは、GNU / Linuxシステムの事実上の標準です。 tarfile は長い名前のGNUtar拡張機能を完全にサポートし、スパースファイルのサポートは読み取り専用です。
POSIX.1-2001 pax形式( PAX_FORMAT )。 これは、事実上制限のない最も柔軟な形式です。 長いファイル名とリンク名、大きなファイルをサポートし、移植可能な方法でパス名を保存します。 ただし、今日のすべてのtar実装がpaxアーカイブを適切に処理できるわけではありません。
pax 形式は、既存の ustar 形式の拡張です。 他の方法では保存できない情報には、追加のヘッダーを使用します。 paxヘッダーには2つの種類があります。拡張ヘッダーは後続のファイルヘッダーにのみ影響し、グローバルヘッダーは完全なアーカイブに有効であり、後続のすべてのファイルに影響します。 paxヘッダー内のすべてのデータは、移植性の理由から UTF-8 でエンコードされています。
読み取ることはできるが作成できないtar形式には、さらにいくつかのバリエーションがあります。
- 古代のV7フォーマット。 これはUnix第7版からの最初のtar形式であり、通常のファイルとディレクトリのみを格納します。 名前は100文字を超えてはならず、ユーザー/グループ名の情報はありません。 一部のアーカイブでは、ASCII以外の文字を含むフィールドの場合、ヘッダーチェックサムが誤って計算されています。
- SunOStar拡張フォーマット。 この形式はPOSIX.1-2001pax形式の変形ですが、互換性はありません。
13.6.6。 Unicodeの問題
tar形式は元々、ファイルシステム情報の保存に主な焦点を当ててテープドライブにバックアップを作成するために考案されました。 現在、tarアーカイブは、ネットワークを介したファイル配布とアーカイブの交換に一般的に使用されています。 元の形式(他のすべての形式の基礎)の問題の1つは、さまざまな文字エンコードをサポートするという概念がないことです。 たとえば、 UTF-8 システムで作成された通常のtarアーカイブは、 ASCII 以外の文字が含まれている場合、 Latin-1 システムで正しく読み取ることができません。 テキストメタデータ(ファイル名、リンク名、ユーザー/グループ名など)は破損しているように見えます。 残念ながら、アーカイブのエンコードを自動検出する方法はありません。 pax形式は、この問題を解決するために設計されました。 ユニバーサル文字エンコード UTF-8 を使用して非ASCIIメタデータを格納します。
tarfile での文字変換の詳細は、 TarFile クラスの encoding および errors キーワード引数によって制御されます。
encoding は、アーカイブ内のメタデータに使用する文字エンコードを定義します。 デフォルト値は、フォールバックとして sys.getfilesystemencoding()または'ascii'
です。 アーカイブが読み取られるか書き込まれるかに応じて、メタデータはデコードまたはエンコードされる必要があります。 encoding が適切に設定されていないと、この変換が失敗する可能性があります。
errors 引数は、変換できない文字の処理方法を定義します。 可能な値は、セクションエラーハンドラーにリストされています。 デフォルトのスキームは'surrogateescape'
で、Pythonはファイルシステムコールにも使用します。ファイル名、コマンドライン引数、および環境変数を参照してください。
PAX_FORMAT アーカイブの場合、すべてのメタデータは UTF-8 を使用して保存されるため、エンコーディングは通常必要ありません。 encoding は、バイナリpaxヘッダーがデコードされる場合、または代理文字を含む文字列が格納される場合にのみ使用されます。