13.6. tarfile --- tar アーカイブファイルの読み書き¶
ソースコード: Lib/tarfile.py
tarfile モジュールは、gzip、bz2、および lzma 圧縮されたものを含む、tar アーカイブを読み書きできます。.zip ファイルの読み書きには zipfile モジュールか、あるいは shutil の高水準関数を使用してください。
いくつかの事実と形態:
- モジュールが利用可能な場合、gzip、bz2ならびにlzmaで圧縮されたアーカイブを読み書きします。
- POSIX.1-1988 (ustar) フォーマットの読み書きをサポートしています。
- longname および longlink 拡張を含む GNU tar フォーマットの読み書きをサポートしています。スパースファイルの復元を含む 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'です。以下に mode のとりうる組み合わせすべてを示します:- mode - action - 'r' または 'r:*'- 圧縮方法に関して透過的に、読み込み用にオープンします (推奨)。 - 'r:'- 非圧縮で読み込み用に排他的にオープンします。 - 'r:gz'- gzip 圧縮で読み込み用にオープンします。 - 'r:bz2'- bzip2 圧縮で読み込み用にオープンします。 - 'r:xz'- lzma 圧縮で読み込み用にオープンします。 - 'x'or- 'x:'- 圧縮せずに tarfile を排他的に作成します。tarfile が既存の場合 - FileExistsError例外を送出します。- 'x:gz'- gzip 圧縮で tarfile を作成します。tarfile が既存の場合 - FileExistsError例外を送出します。- 'x:bz2'- bzip2 圧縮で tarfile を作成します。tarfile が既存の場合 - FileExistsError例外を送出します。- 'x:xz'- lzma 圧縮で tarfile を作成します。tarfile が既存の場合 - FileExistsError例外を送出します。- 'a' または 'a:'- 非圧縮で追記用にオープンします。ファイルが存在しない場合は新たに作成されます。 - 'w' または 'w:'- 非圧縮で書き込み用にオープンします。 - 'w:gz'- gzip 圧縮で書き込み用にオープンします。 - 'w:bz2'- bzip2 圧縮で書き込み用にオープンします。 - 'w:xz'- lzma 圧縮で書き込み用にオープンします。 - 'a:gz'、- 'a:bz2'、- 'a:xz'は利用できないことに注意して下さい。もし mode が、ある (圧縮した) ファイルを読み込み用にオープンするのに適していないなら、- ReadErrorが送出されます。これを防ぐには mode- 'r'を使って下さい。もし圧縮方式がサポートされていなければ、- CompressionErrorが送出されます。- もし fileobj が指定されていれば、それは name でバイナリモードでオープンされた ファイルオブジェクト の代替として使うことができます。そのファイルオブジェクトの位置が 0 であることを前提に動作します。 - 'w:gz'、- 'r:gz'、- 'w:bz2'、- 'r:bz2',- 'x:gz',- 'x:bz2'モードの場合、- tarfile.open()はファイルの圧縮レベルを指定するキーワード引数 compresslevel (デフォルトは- 9) を受け付けます。- 特別な目的のために、mode には 2 番目の形式: - 'ファイルモード|[圧縮]'があります。この形式を使うと、- tarfile.open()が返すのは、データをブロックからなるストリームとして扱う- TarFileオブジェクトになります。この場合、ファイルに対してランダムなシークが行えなくなります。fileobj を指定する場合、- read()および- write()メソッドを持つ (mode に依存した) 任意のオブジェクトにできます。bufsize にはブロックサイズを指定します。デフォルトは- 20 * 512バイトです。- sys.stdin、ソケット file object、あるいはテープデバイスと組み合わせる場合にはこの形式を使ってください。ただし、このような- TarFileオブジェクトにはランダムアクセスを行えないという制限があります。使用例 節を参照してください。現在可能なモードは以下のとおりです。- モード - 動作 - 'r|*'- tar ブロックの stream を圧縮方法に関して透過的に読み込み用にオープンします。 - 'r|'- 非圧縮 tar ブロックの stream を読み込み用にオープンします。 - 'r|gz'- gzip 圧縮の stream を読み込み用にオープンします。 - 'r|bz2'- bzip2 圧縮の stream を読み込み用にオープンします。 - 'r|xz'- lzma 圧縮の stream を読み込み用にオープンします。 - 'w|'- 非圧縮の stream を書き込み用にオープンします。 - 'w|gz'- gzip 圧縮の stream を書き込み用にオープンします。 - 'w|bz2'- bzip2 圧縮の stream を書き込み用にオープンします。 - 'w|xz'- lzma 圧縮の stream を書き込み用にオープンします。 - バージョン 3.5 で変更: - 'x'(排他的作成) モードが追加されました。
- 
class tarfile.TarFile¶
- tar アーカイブを読み書きするためのクラスです。このクラスを直接使わないこと: 代わりに - tarfile.open()を使ってください。TarFile オブジェクト を参照してください。
tarfile モジュールは以下の例外を定義しています:
- 
exception tarfile.CompressionError¶
- 圧縮方法がサポートされていないか、あるいはデータを正しくデコードできない時に送出されます。 
- 
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¶
- GNU tar フォーマット。 
- 
tarfile.PAX_FORMAT¶
- POSIX.1-2001 (pax) フォーマット。 
- 
tarfile.DEFAULT_FORMAT¶
- アーカイブを作成する際のデフォルトのフォーマット。現在は - GNU_FORMATです。
参考
- zipfileモジュール
- zipfile標準モジュールのドキュメント。
- アーカイブ化操作
- shutilが提供するより高水準のアーカイブ機能についてのドキュメント。
- GNU tar manual, Basic Tar Format
- GNU tar 拡張機能を含む、tar アーカイブファイルのためのドキュメント。
13.6.1. TarFile オブジェクト¶
TarFile オブジェクトは、tar アーカイブへのインターフェースを提供します。tar アーカイブは一連のブロックです。アーカイブメンバー (保存されたファイル) は、ヘッダーブロックとそれに続くデータブロックで構成されています。一つの tar アーカイブにファイルを何回も保存することができます。各アーカイブメンバーは、TarInfo オブジェクトで確認できます。詳細については TarInfo オブジェクト を参照してください。
TarFile オブジェクトは with 文のコンテキストマネージャーとして利用できます。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 is the pathname of the archive. It can be omitted if fileobj is given. In this case, the file object's - nameattribute is used if it exists.- mode は、既存のアーカイブから読み込むための - 'r'、既存のアーカイブに追記するための- 'a'、既存のファイルがあれば上書きして新しいファイルを作成する- 'w'、あるいは存在しない場合にのみ新しいファイルを作成する- 'x'のいずれかです。- fileobj が与えられていれば、それを使ってデータを読み書きします。もしそれが決定できれば、mode は 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()使用時にすべてのエラーが無視されます。エラーが無視された場合でも、debug が有効であれば、エラーメッセージは出力されます。- 1の場合、すべての 致命的な(fatal) エラーは- OSErrorを送出します。- 2の場合、すべての 致命的でない(non-fatal) エラーも- TarError例外として送出されます。- 引数 encoding および errors にはアーカイブの読み書きやエラー文字列の変換に使用する文字エンコーディングを指定します。ほとんどのユーザーはデフォルト設定のままで動作します。詳細に関しては Unicode に関する問題 節を参照してください。 - 引数 pax_headers は、オプションの文字列辞書で、format が - PAX_FORMATだった場合に pax グローバルヘッダーに追加されます。- バージョン 3.2 で変更: 引数 errors のデフォルトが - 'surrogateescape'になりました。- バージョン 3.5 で変更: - 'x'(排他的作成) モードが追加されました。
- 
classmethod TarFile.open(...)¶
- 代替コンストラクターです。モジュールレベルでの - tarfile.open()関数は、実際はこのクラスメソッドへのショートカットです。
- 
TarFile.getmember(name)¶
- メンバー name に対する - TarInfoオブジェクトを返します。name がアーカイブに見つからなければ、- KeyErrorが送出されます。- 注釈 - アーカイブ内にメンバーが複数ある場合は、最後に出現するものが最新のバージョンとみなされます。 
- 
TarFile.getnames()¶
- メンバーをその名前のリストを返します。これは - getmembers()で返されるリストと同じ順番です。
- 
TarFile.list(verbose=True, *, members=None)¶
- 内容の一覧を - sys.stdoutに出力します。verbose が- Falseの場合、メンバー名のみ表示します。- Trueの場合、 ls -l に似た出力を生成します。オプションの members を与える場合、- getmembers()が返すリストのサブセットである必要があります。- バージョン 3.5 で変更: members 引数が追加されました。. 
- 
TarFile.next()¶
- TarFileが読み込み用にオープンされている時、アーカイブの次のメンバーを- TarInfoオブジェクトとして返します。もしそれ以上利用可能なものがなければ、- Noneを返します。
- 
TarFile.extractall(path=".", members=None, *, numeric_owner=False)¶
- すべてのメンバーをアーカイブから現在の作業ディレクトリまたは path に抽出します。オプションの members が与えられるときには、 - getmembers()で返されるリストの一部でなければなりません。所有者、変更時刻、アクセス権限のようなディレクトリ情報はすべてのメンバーが抽出された後にセットされます。これは二つの問題を回避するためです。一つはディレクトリの変更時刻はその中にファイルが作成されるたびにリセットされるということ、もう一つはディレクトリに書き込み許可がなければその中のファイル抽出は失敗してしまうということです。- numeric_owner が - Trueの場合、tarfile の uid と gid 数値が抽出されたファイルのオーナー/グループを設定するために使用されます。False の場合、tarfile の名前付きの値が使用されます。- 警告 - 内容を信頼できない tar アーカイブを、事前の内部チェック前に展開してはいけません。ファイルが path の外側に作られる可能性があります。例えば、 - "/"で始まる絶対パスのファイル名や、2 重ドット- ".."で始まるパスのファイル名です。- バージョン 3.5 で変更: numeric_owner 引数が追加されました。 
- 
TarFile.extract(member, path="", set_attrs=True, *, numeric_owner=False)¶
- Extract a member from the archive to the current working directory, using its full name. Its file information is extracted as accurately as possible. member may be a filename or a - TarInfoobject. You can specify a different directory using path. File attributes (owner, mtime, mode) are set unless set_attrs is false.- numeric_owner が - Trueの場合、tarfile の uid と gid 数値が抽出されたファイルのオーナー/グループを設定するために使用されます。False の場合、tarfile の名前付きの値が使用されます。- 注釈 - extract()メソッドはいくつかの展開に関する問題を扱いません。ほとんどの場合、- extractall()メソッドの利用を考慮するべきです。- 警告 - extractall()の警告を参してください。- バージョン 3.2 で変更: パラメーターに set_attrs を追加しました。 - バージョン 3.5 で変更: numeric_owner 引数が追加されました。 
- 
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 を与える場合、binary file にしなければならず、- tarinfo.sizeバイトがそれから読まれ、アーカイブに追加されます。- TarInfoオブジェクトを直接作成するか、- gettarinfo()を使って作成することができます。
- 
TarFile.gettarinfo(name=None, arcname=None, fileobj=None)¶
- Create a - TarInfoobject from the result of- os.stat()or equivalent on an existing file. The file is either named by name, or specified as a file object fileobj with a file descriptor. If given, arcname specifies an alternative name for the file in the archive, otherwise, the name is taken from fileobj’s- nameattribute, or the name argument. The name should be a text string.- TarInfoの属性の一部は、- addfile()を使用して追加する前に修正できます。ファイルオブジェクトが、ファイルの先頭にある通常のファイルオブジェクトでない場合、- sizeなどの属性は修正が必要かもしれません。これは、- GzipFileなどの属性に当てはまります。- nameも修正できるかもしれず、この場合、arcname はダミーの文字列にすることができます。
- 
TarFile.pax_headers¶
- pax グローバルヘッダーに含まれる key-value ペアの辞書です。 
13.6.2. TarInfo オブジェクト¶
TarInfo オブジェクトは TarFile の一つのメンバーを表します。ファイルに必要なすべての属性 (ファイルタイプ、ファイルサイズ、時刻、アクセス権限、所有者等のような) を保存する他に、そのタイプを決定するのに役に立ついくつかのメソッドを提供します。これにはファイルのデータそのものは 含まれません 。
TarInfo オブジェクトは TarFile のメソッド getmember()、 getmembers() および gettarinfo() によって返されます。
- 
classmethod TarInfo.frombuf(buf, encoding, errors)¶
- TarInfoオブジェクトを文字列バッファー buf から作成して返します。- バッファーが不正な場合 - HeaderErrorを送出します。
- 
classmethod TarInfo.fromtarfile(tarfile)¶
- TarFileオブジェクトの tarfile から、次のメンバーを読み込んで、それを- TarInfoオブジェクトとして返します。
- 
TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape')¶
- TarInfoオブジェクトから文字列バッファーを作成します。引数についての情報は、- TarFileクラスのコンストラクターを参照してください。- バージョン 3.2 で変更: 引数 errors のデフォルトが - 'surrogateescape'になりました。
TarInfo オブジェクトには以下のデータ属性があります:
- 
TarInfo.name¶
- アーカイブメンバーの名前。 
- 
TarInfo.size¶
- バイト単位でのサイズ。 
- 
TarInfo.mtime¶
- 最後に変更された時刻。 
- 
TarInfo.mode¶
- 許可ビット。 
- 
TarInfo.type¶
- ファイルタイプ。type は通常、定数 - REGTYPE、- AREGTYPE、- LNKTYPE、- SYMTYPE、- DIRTYPE、- FIFOTYPE、- CONTTYPE、- CHRTYPE、- BLKTYPE、あるいは- GNUTYPE_SPARSEのいずれかです。- TarInfoオブジェクトのタイプをもっと簡単に解決するには、下記の- is*()メソッドを使って下さい。
- 
TarInfo.uid¶
- ファイルメンバーを保存した元のユーザーのユーザー ID。 
- 
TarInfo.gid¶
- ファイルメンバーを保存した元のユーザーのグループ ID。 
- 
TarInfo.uname¶
- ファイルメンバーを保存した元のユーザーのユーザー名。 
- 
TarInfo.gname¶
- ファイルメンバーを保存した元のユーザーのグループ名。 
- 
TarInfo.pax_headers¶
- pax 拡張ヘッダーに関連付けられた、key-value ペアの辞書。 
TarInfo オブジェクトは便利な照会用のメソッドもいくつか提供しています:
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.4. 使用例¶
tar アーカイブから現在のディレクトリにすべて抽出する方法:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
tar アーカイブの一部を、リストの代わりにジェネレーター関数を利用して TarFile.extractall() で展開する方法:
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 モジュールは 3 種類の tar フォーマットを作成することができます:
- POSIX.1-1988 ustar format ( - USTAR_FORMAT). ファイル名の長さは256文字までで、リンク名の長さは100文字までです。最大のファイルサイズは8GiBです。このフォーマットは古くて制限が多いですが、広くサポートされています。
- GNU tar format ( - GNU_FORMAT). 長いファイル名とリンク名、8GiBを超えるファイルやスパース(sparse)ファイルをサポートしています。これは GNU/Linux システムにおいてデファクト・スタンダードになっています。- tarfileモジュールは長いファイル名を完全にサポートしています。 スパースファイルは読み込みのみサポートしています。
- POSIX.1-2001 pax フォーマット ( - PAX_FORMAT)。最も柔軟性があり、ほぼ制限が無いフォーマットです。長いファイル名やリンク名、大きいファイルをサポートし、パス名をポータブルな方法で保存します。しかし、現在のところ、すべての tar の実装が pax フォーマットを正しく扱えるわけではありません。- pax フォーマットは既存の ustar フォーマットの拡張です。ustar では保存できない情報を追加のヘッダーを利用して保存します。pax には 2 種類のヘッダーがあります。1 つ目は拡張ヘッダーで、その次のファイルヘッダーに影響します。2 つ目はグローバルヘッダーで、アーカイブ全体に対して有効で、それ以降のすべてのファイルに影響します。すべての pax ヘッダーの内容は、ポータブル性のために UTF-8 で保存されます。 
他にも、読み込みのみサポートしている tar フォーマットがいくつかあります:
- ancient V7 フォーマット。これは Unix 7th Edition から存在する、最初の tar フォーマットです。通常のファイルとディレクトリのみ保存します。名前は 100 文字を超えてはならず、ユーザー/グループ名に関する情報は保存されません。いくつかのアーカイブは、フィールドが ASCII でない文字を含む場合に、ヘッダーのチェックサムの計算を誤ります。
- SunOS tar 拡張フォーマット。POSIX.1-2001 pax フォーマットの亜流ですが、互換性がありません。
13.6.6. Unicode に関する問題¶
tar フォーマットは、もともとテープドライブにファイルシステムのバックアップをとる目的で設計されました。現在、tarアーカイブはファイルを配布する際に一般的に用いられ、ネットワーク上で交換されています。オリジナルフォーマットが抱える一つの問題は (他の多くのフォーマットでも同じですが)、様々な文字エンコーディングのサポートについて考慮していないことです。例えば、UTF-8 システム上で作成された通常の tar アーカイブは、非 ASCII 文字を含んでいた場合、Latin-1 システムでは正しく読み取ることができません。テキストのメタデータ (ファイル名、リンク名、ユーザー/グループ名など) は破壊されます。残念なことに、アーカイブのエンコーディングを自動検出する方法はありません。pax フォーマットはこの問題を解決するために設計されました。これは非 ASCII メタデータをユニバーサル文字エンコーディング UTF-8 を使用して格納します。
tarfile における文字変換処理の詳細は TarFile クラスのキーワード引数 encoding および errors によって制御されます。
encoding はアーカイブのメタデータに使用する文字エンコーディングを指定します。デフォルト値は sys.getfilesystemencoding() で、フォールバックとして 'ascii' が使用されます。アーカイブの読み書き時に、メタデータはそれぞれデコードまたはエンコードしなければなりません。encoding に適切な値が設定されていない場合、その変換は失敗することがあります。
引数 errors は文字を変換できない時の扱いを指定します。指定できる値は エラーハンドラ 節を参照してください。デフォルトのスキームは 'surrogateescape' で、Python はそのファイルシステムの呼び出しも使用します。ファイル名、コマンドライン引数、および環境変数 を参照してください。
PAX_FORMAT アーカイブの場合、メタデータはすべて UTF-8 で格納されるため、encoding は通常指定する必要はありません。encoding は、まれにある、バイナリの pax ヘッダーがデコードされた場合、あるいはサロゲート文字を含む文字列が格納されていた場合に使用されます。
