tarfile — tarアーカイブファイルの読み取りと書き込み—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/tarfile
移動先:案内検索

tarfile —tarアーカイブファイルの読み取りと書き込み

ソースコード: :source: `Lib / tarfile.py`



tarfile モジュールを使用すると、gzip、bz2、およびlzma圧縮を使用するアーカイブを含むtarアーカイブの読み取りと書き込みが可能になります。 zipfile モジュールを使用して、.zipファイル、または shutil の上位関数を読み書きします。

いくつかの事実と数字:

  • gzipbz2 、および 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)

パス名 nameTarFile オブジェクトを返します。 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.is_tarfile(name)
name がtarアーカイブファイルの場合、 tarfile モジュールが読み取ることができる True を返します。

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

アーカイブを作成するためのデフォルトの形式。 これは現在 PAX_FORMAT です。

バージョン3.8で変更:新しいアーカイブのデフォルト形式が GNU_FORMAT から PAX_FORMAT に変更されました。

も参照してください

モジュール zipfile
zipfile 標準モジュールのドキュメント。
アーカイブ操作
標準の shutil モジュールによって提供される高レベルのアーカイブ機能のドキュメント。
GNU tarマニュアル、基本的なtar形式
GNUtar拡張機能を含むtarアーカイブファイルのドキュメント。


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 はアーカイブのパス名です。 namepath-likeオブジェクトである可能性があります。 fileobj が指定されている場合は、省略できます。 この場合、ファイルオブジェクトのname属性が存在する場合はそれが使用されます。

モードは、既存のアーカイブから読み取る'r'、既存のファイルにデータを追加する'a'、既存のファイルを上書きする新しいファイルを作成する'w'のいずれかです。 1つ、または'x'を使用して、新しいファイルがまだ存在しない場合にのみ作成します。

fileobj を指定すると、データの読み取りまたは書き込みに使用されます。 判別できる場合は、モードfileobj のモードで上書きされます。 fileobj は位置0から使用されます。

ノート

TarFile が閉じている場合、 fileobj は閉じられません。

format は、書き込み用のアーカイブ形式を制御します。 モジュールレベルで定義されている定数 USTAR_FORMATGNU_FORMAT 、または PAX_FORMAT のいずれかである必要があります。 読み取り時に、単一のアーカイブに異なるフォーマットが存在する場合でも、フォーマットは自動的に検出されます。

tarinfo 引数を使用して、デフォルトの TarInfo クラスを別のクラスに置き換えることができます。

dereferenceFalse の場合、アーカイブにシンボリックリンクとハードリンクを追加します。 True の場合は、ターゲットファイルのコンテンツをアーカイブに追加します。 これは、シンボリックリンクをサポートしていないシステムには影響しません。

ignore_zerosFalse の場合、空のブロックをアーカイブの終わりとして扱います。 True の場合は、空の(無効な)ブロックをスキップして、できるだけ多くのメンバーを取得するようにしてください。 これは、連結または破損したアーカイブを読み取る場合にのみ役立ちます。

debug は、0(デバッグメッセージなし)から3(すべてのデバッグメッセージ)まで設定できます。 メッセージはsys.stderrに書き込まれます。

errorlevel0の場合、 TarFile.extract()を使用するとすべてのエラーが無視されます。 それでも、デバッグが有効になっている場合は、デバッグ出力にエラーメッセージとして表示されます。 1の場合、すべての fatal エラーは OSError 例外として発生します。 2の場合、すべての致命的でないエラーは、 TarError 例外としても発生します。

encoding および errors 引数は、アーカイブの読み取りまたは書き込みに使用される文字エンコードと、変換エラーの処理方法を定義します。 デフォルト設定はほとんどのユーザーで機能します。 詳細については、セクション Unicodeの問題を参照してください。

pax_headers 引数は、 formatPAX_FORMAT の場合、paxグローバルヘッダーとして追加される文字列のオプションの辞書です。

バージョン3.2で変更: エラー引数のデフォルトとして'surrogateescape'を使用します。

バージョン3.5で変更: 'x'(排他的作成)モードが追加されました。

バージョン3.6で変更: name パラメーターは、パスのようなオブジェクトを受け入れます。

classmethod TarFile.open(...)
代替コンストラクター。 tarfile.open()関数は、実際にはこのクラスメソッドへのショートカットです。
TarFile.getmember(name)

メンバー nameTarInfo オブジェクトを返します。 name がアーカイブに見つからない場合、 KeyError が発生します。

ノート

メンバーがアーカイブ内で複数回出現する場合、その最後の出現が最新バージョンであると見なされます。

TarFile.getmembers()
アーカイブのメンバーを TarInfo オブジェクトのリストとして返します。 リストの順序は、アーカイブのメンバーと同じです。
TarFile.getnames()
メンバーを名前のリストとして返します。 getmembers()によって返されるリストと同じ順序です。
TarFile.list(verbose=True, *, members=None)

sys.stdoutに目次を印刷します。 verboseFalse の場合、メンバーの名前のみが出力されます。 True の場合、 ls -l と同様の出力が生成されます。 オプションの members を指定する場合は、 getmembers()によって返されるリストのサブセットである必要があります。

バージョン3.5で変更: メンバーパラメーターが追加されました。

TarFile.next()
TarFile が読み取り用に開かれている場合、アーカイブの次のメンバーを TarInfo オブジェクトとして返します。 利用可能なものがなくなった場合は、なしを返します。
TarFile.extractall(path='.', members=None, *, numeric_owner=False)

アーカイブから現在の作業ディレクトリまたはディレクトリパスにすべてのメンバーを抽出します。 オプションの members を指定する場合は、 getmembers()によって返されるリストのサブセットである必要があります。 所有者、変更時間、権限などのディレクトリ情報は、すべてのメンバーが抽出された後に設定されます。 これは、2つの問題を回避するために行われます。ディレクトリにファイルが作成されるたびに、ディレクトリの変更時刻がリセットされます。 また、ディレクトリのアクセス許可で書き込みが許可されていない場合、ディレクトリへのファイルの抽出は失敗します。

numeric_ownerTrue の場合、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_ownerTrue の場合、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, *, filter=None)

ファイル name をアーカイブに追加します。 name は、任意のタイプのファイル(ディレクトリ、FIFO、シンボリックリンクなど)にすることができます。 指定した場合、 arcname は、アーカイブ内のファイルの代替名を指定します。 ディレクトリはデフォルトで再帰的に追加されます。 これは、 recursiveFalse に設定することで回避できます。 再帰は、ソートされた順序でエントリを追加します。 filter が指定されている場合、それは TarInfo オブジェクト引数を取り、変更された TarInfo オブジェクトを返す関数である必要があります。 代わりに None を返す場合、 TarInfo オブジェクトはアーカイブから除外されます。 例については、を参照してください。

バージョン3.2で変更: filter パラメーターが追加されました。

バージョン3.7で変更: Recursionは、ソートされた順序でエントリを追加します。

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 として指定されます。 namepath-likeオブジェクトである可能性があります。 指定されている場合、 arcname はアーカイブ内のファイルの代替名を指定します。指定されていない場合、名前は fileobjname 属性またはから取得されます。 ] name 引数。 名前はテキスト文字列である必要があります。

addfile()を使用して追加する前に、 TarInfo の属性の一部を変更できます。 ファイルオブジェクトがファイルの先頭にある通常のファイルオブジェクトでない場合は、 size などの属性を変更する必要があります。 これは、 GzipFile などのオブジェクトの場合です。 name も変更できます。その場合、 arcname はダミー文字列になる可能性があります。

バージョン3.6で変更: name パラメーターは、パスのようなオブジェクトを受け入れます。

TarFile.close()
TarFile を閉じます。 書き込みモードでは、2つの終了ゼロブロックがアーカイブに追加されます。
TarFile.pax_headers
paxグローバルヘッダーのキーと値のペアを含む辞書。


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つです:REGTYPEAREGTYPELNKTYPESYMTYPEDIRTYPE、[ X104X] 、CONTTYPECHRTYPEBLKTYPEGNUTYPE_SPARSETarInfo オブジェクトのタイプをより便利に判別するには、以下のis*()メソッドを使用します。
TarInfo.linkname
タイプLNKTYPEおよびSYMTYPETarInfo オブジェクトにのみ存在するターゲットファイル名の名前。
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 を返します。


コマンドラインインターフェイス

バージョン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

コマンドラインオプション

-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
冗長出力。


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

サポートされている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 )。 これは、事実上制限のない最も柔軟な形式です。 長いファイル名とリンク名、大きなファイルをサポートし、移植可能な方法でパス名を保存します。 GNU tar、bsdtar / libarchive、starなどの最新のtar実装は、拡張 pax 機能を完全にサポートしています。 一部の古いライブラリやメンテナンスされていないライブラリはそうではないかもしれませんが、 pax アーカイブを普遍的にサポートされている ustar 形式であるかのように扱う必要があります。 これは、新しいアーカイブの現在のデフォルト形式です。

    これは、既存の ustar 形式を拡張し、他の方法では保存できない情報用の追加のヘッダーを追加します。 paxヘッダーには2つの種類があります。拡張ヘッダーは後続のファイルヘッダーにのみ影響し、グローバルヘッダーは完全なアーカイブに有効であり、後続のすべてのファイルに影響します。 paxヘッダー内のすべてのデータは、移植性の理由から UTF-8 でエンコードされています。

読み取ることはできるが作成できないtar形式には、さらにいくつかのバリエーションがあります。

  • 古代のV7フォーマット。 これはUnix第7版からの最初のtar形式であり、通常のファイルとディレクトリのみを格納します。 名前は100文字を超えてはならず、ユーザー/グループ名の情報はありません。 一部のアーカイブでは、ASCII以外の文字を含むフィールドの場合、ヘッダーチェックサムが誤って計算されています。
  • SunOStar拡張フォーマット。 この形式はPOSIX.1-2001pax形式の変形ですが、互換性はありません。


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ヘッダーがデコードされる場合、または代理文字を含む文字列が格納される場合にのみ使用されます。