12.5. tarfile — tar アーカイブファイルを読み書きする — Python 2.7ja1 documentation

### ナビゲーション

- 索引
- モジュール |
- 次へ |
- 前へ |
- Python 2.7ja1 documentation »
- Python 標準ライブラリ »
- 12. データ圧縮とアーカイブ »

# 12.5. `tarfile` — tar アーカイブファイルを読み書きする

バージョン 2.3 で追加.

`tarfile` モジュールは、gzipやbz2圧縮されたものも含めて、tarアーカイブの読み書きができます。 (`.zip` ファイルの読み書きは `zipfile` モジュールで可能です。)

いくつかの事実と外観：

- `gzip` と `bz2` で圧縮されたアーカイブを読み書きします。

- POSIX.1-1988 (ustar) フォーマットの読み書きをサポートしています。

- longname, longlink 拡張を含めた、GNU tarフォーマットの読み書きをサポートしています。 sparse 拡張は読み込みのみサポートしています。

- POSIX.1-2001 (pax) フォーマットの読み書きをサポートしています。

  バージョン 2.6 で追加.

- ディレクトリ、普通のファイル、ハードリンク、シンボリックリンク、fifo、キャラクタデバイスおよびブロックデバイスを処理します。また、タイムスタンプ、アクセス許可およびオーナーのようなファイル情報の取得および保存が可能です。

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

  パス名 name の `TarFile` オブジェクトを返します。 `TarFile` オブジェクトと、利用出来るキーワード引数に関する詳細な情報については、 TarFile オブジェクト 節を参照してください。

  mode は `'filemode[:compression]'` の形式をとる文字列でなければなりません。デフォルトの値は `'r'` です。以下に mode のとりうる組み合わせ全てを示します。

  mode | 動作
  --- | ---
  `'r' または 'r:*'` | 圧縮方法に関して透過的に、読み込み用にオープンします(推奨)。
  `'r:'` | 非圧縮で読み込み用に排他的にオープンします。
  `'r:gz'` | gzip 圧縮で読み込み用にオープンします。
  `'r:bz2'` | bzip2 圧縮で読み込み用にオープンします。
  `'a' または 'a:'` | 非圧縮で追加用にオープンします。ファイルが存在しない場合は新たに作成されます。
  `'w' または 'w:'` | 非圧縮で書き込み用にオープンします。
  `'w:gz'` | gzip 圧縮で書き込み用にオープンします。
  `'w:bz2'` | bzip2 圧縮で書き込み用にオープンします。

  `'a:gz'` あるいは `'a:bz2'` は可能ではないことに注意して下さい。もし mode が、ある(圧縮した)ファイルを読み込み用にオープンするのに適していないなら、 `ReadError` が発生します。これを防ぐには mode `'r'` を使って下さい。もし圧縮メソッドがサポートされていなければ、 `CompressionError` が発生します。

  もし fileobj が指定されていれば、それは name でオープンされたファイルオブジェクトの代替として使うことができます。そのファイルオブジェクトの位置が0にあることを前提に動作します。

  特別な目的のために、 mode の2番目の形式: `'ファイルモード|[圧縮]'` があります。この形式を使うと、 `tarfile.open()` が返すのはデータをブロックからなるストリームとして扱う `TarFile` オブジェクトになります。この場合、ファイルに対してランダムな seek を行えなくなります。 fileobj を指定する場合、 `read()` および `write()` メソッドを持つ任意のオブジェクトにできます。 bufsize にはブロックサイズを指定します。デフォルトは `20 * 512` バイトです。 `sys.stdin` 、ソケットファイルオブジェクト、テープデバイスと組み合わせる場合にはこの形式を使ってください。ただし、このような `TarFile` オブジェクトにはランダムアクセスを行えないという制限があります。 例 節を参照してください。現在可能なモードは：

  モード | 動作
  --- | ---
  `'r|*'` | tar ブロックの ストリーム を 圧縮方法に関して透過的に読み込み用にオープンします。
  `'r|'` | 非圧縮 tar ブロックの ストリーム を読み込み用にオープンします。
  `'r|gz'` | gzip 圧縮の ストリーム を読み込み用にオープンします。
  `'r|bz2'` | bzip2 圧縮の ストリーム を読み込み用にオープンします。
  `'w|'` | 非圧縮の ストリーム を書き込み用にオープンします。
  `'w|gz'` | gzip 圧縮の ストリーム を書き込み用にオープンします。
  `'w|bz2'` | bzip2 圧縮の ストリーム を書き込み用にオープンします。

class `tarfile.` `TarFile`

  tar アーカイブを読んだり、書いたりするためのクラスです。このクラスを直接使わず、代わりに `tarfile.open()` を使ってください。 TarFile オブジェクト を参照してください。

`tarfile.` `is_tarfile`(name)

  もし name が tar アーカイブファイルであり、 `tarfile` モジュールで読み出せる場合に `True` を返します。

class `tarfile.` `TarFileCompat`(filename, mode='r', compression=TAR_PLAIN)

  `zipfile` 風なインターフェースを持つ tar アーカイブへの制限されたアクセスのためのクラスです。詳細は `zipfile` のドキュメントを参照してください。 compression は、以下の定数のどれかでなければなりません：

  `TAR_PLAIN`

    非圧縮 tar アーカイブのための定数。

  `TAR_GZIPPED`

    `gzip` 圧縮 tar アーカイブのための定数。

  バージョン 2.6 で撤廃: `TarFileCompat` クラスは、 Python 3.0 で削除されるので、非推奨になりました。

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()` メソッドが、バッファが不正だったときに送出します。

  バージョン 2.6 で追加.

以下の各定数は、 `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`

以下のモジュールレベル変数が利用できます。

`tarfile.` `ENCODING`

  デフォルト文字エンコーディング。 `sys.getfilesystemencoding()` か `sys.getdefaultencoding()` のどちらかの値。

参考

Module `zipfile`
  `zipfile` 標準モジュールのドキュメント。

GNU tar マニュアル, 基本 Tar 形式
  GNU tar 拡張機能を含む、 tar アーカイブファイルのためのドキュメント。

## 12.5.1. TarFile オブジェクト

`TarFile` オブジェクトは、tar アーカイブへのインターフェースを提供します。 tar アーカイブは一連のブロックです。アーカイブメンバー(保存されたファイル)は、ヘッダーブロックとそれに続くデータブロックから構成されています。ある tar アーカイブにファイルを何回も保存することができます。各アーカイブメンバーは、 `TarInfo` オブジェクトによって表わされます、詳細については TarInfo オブジェクト を参照してください。

`TarFile` オブジェクトは `with` 文によりコンテキストマネージャーとして利用できます。 with ブロックが終了したときにオブジェクトは close されます。例外が発生した時、内部で利用されているファイルオブジェクトのみが close され、開かれたアーカイブは終了されないことに注意してください。 例 セクションにあるユースケースを参照してください。

バージョン 2.7 で追加: コンテキストマネージャープロトコルがサポートされました。

class `tarfile.` `TarFile`(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors=None, pax_headers=None, debug=0, errorlevel=0)

  以下の全ての引数はオプションで、インスタンス属性としてもアクセスすることができます。

  name はアーカイブのパス名。 fileobj が渡された場合は省略可能。その場合、ファイルオブジェクトの `name` 属性があれば、それを利用します。

  mode は、既存のアーカイブファールから読み込むための `'r'`, 既存のアーカイブファイルに追記するための `'a'`, 既存のファイルがあれば上書きして新しいファイルを作成する `'w'` のいずれかです。

  もし fileobj が与えられていれば、それを使ってデータを読み書きします。もしそれが決定できれば、 mode は fileobj のモードで上書きされます。 fileobj は位置0から利用されます。

  ノート

  `TarFile` をクローズする時に、 fileobj はクローズされません。

  format はアーカイブのフォーマットを制御します。モジュールレベルで定義されている、 `USTAR_FORMAT`, `GNU_FORMAT`, `PAX_FORMAT` のいずれかである必要があります。

  バージョン 2.6 で追加.

  tarinfo 引数を利用して、デフォルトの `TarInfo` クラスを別のクラスで置き換えられます。

  バージョン 2.6 で追加.

  dereference が `False` だった場合、シンボリックリンクやハードリンクがアーカイブに追加されます。 `True` だった場合、リンクのターゲットとなるファイルの内容がアーカイブに追加されます。シンボリックリンクをサポートしていないシステムでは効果がありません。

  ignore_zeros が `False` だった場合、空ブロックをアーカイブの終端だと扱います。 `True` だった場合、空の(無効な)ブロックをスキップして、可能な限り多くのメンバを取得しようとします。このオプションは、連結(concatenate)されたり、壊れたアーカイブファイルを扱うときにのみ、意味があります。

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

  errorlevel が `0` の場合、 `TarFile.extract()` 使用時に全てのエラーが無視されます。エラーが無視された場合でも、 debug が有効であれば、エラーメッセージは出力されます。 `1` の場合、全ての 致命的な(fatal) エラーは `OSError` か `IOError` を送出します。 `2` の場合、全ての 致命的でない(non-fatal) エラーも `TarError` 例外として送出されます。

  encoding と errors 引数は、文字列と unicode オブジェクトとの間の相互変換方法を指定します。デフォルトの設定で、ほとんどのユーザーでうまく動作するでしょう。詳しい情報は、 Unicode に関する問題 節を参照してください。

  バージョン 2.6 で追加.

  pax_headers 引数は、オプションの、 unicode 文字列の辞書で、 format が `PAX_FORMAT` だった場合に pax グローバルヘッダに追加されます。

  バージョン 2.6 で追加.

`TarFile.` `open`(...)

  代替コンストラクタです。モジュールレベルでの `tarfile.open()` 関数は、実際はこのクラスメソッドへのショートカットです。

`TarFile.` `getmember`(name)

  メンバー name に対する `TarInfo` オブジェクトを返します。もし name がアーカイブに見つからなければ、 `KeyError` が発生します。

  ノート

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

`TarFile.` `getmembers`()

  `TarInfo` アーカイブのメンバーをオブジェクトのリストとして返します。このリストはアーカイブ内のメンバーと同じ順番です。

`TarFile.` `getnames`()

  メンバーをその名前のリストとして返します。これは `getmembers()` で返されるリストと同じ順番です。

`TarFile.` `list`(verbose=True)

  目次を `sys.stdout` に表示します。もし verbose が `False` であれば、メンバー名のみ表示します。 `True` であれば、 `"ls -l"` に似た出力を生成します。

`TarFile.` `next`()

  `TarFile` が読み込み用にオープンされている時、アーカイブの次のメンバーを `TarInfo` オブジェクトとして返します。もしそれ以上利用可能なものがなければ、 `None` を返します。

`TarFile.` `extractall`(path=".", members=None)

  全てのメンバーをアーカイブから現在の作業ディレクトリーまたは path に抽出します。オプションの members が与えられるときには、 `getmembers()` で返されるリストの一部でなければなりません。所有者、変更時刻、パーミッションのようなディレクトリー情報は全てのメンバーが抽出された後にセットされます。これは二つの問題を回避するためです。一つはディレクトリーの変更時刻はその中にファイルが作成されるたびにリセットされるということ。もう一つは、ディレクトリーに書き込み許可がなければその中のファイル抽出は失敗してしまうということです。

  警告

  内容を信頼できないtarアーカイブを、事前の内部チェック前に展開してはいけません。ファイルが path の外側に作られる可能性があります。例えば、 `"/"` で始まる絶対パスのファイル名や、2重ドット `".."` で始まるパスのファイル名です。

  バージョン 2.5 で追加.

`TarFile.` `extract`(member, path="")

  メンバーをアーカイブから現在の作業ディレクトリに、その完全名を使って抽出します。ファイル情報はできるだけ正確に抽出されます。 member は、ファイル名でも `TarInfo` オブジェクトでも構いません。 path を使って、異なるディレクトリを指定することができます。

  ノート

  `extract()` メソッドは幾つかの展開に関する問題を扱いません。殆どの場合、 `extractall()` メソッドの利用を考慮するべきです。

  警告

  `extractall()` の警告(warning)を参照

`TarFile.` `extractfile`(member)

  アーカイブからメンバーをオブジェクトとして抽出します。 member は、ファイル名あるいは `TarInfo` オブジェクトです。もし member が普通のファイルであれば、ファイル風のオブジェクトを返します。もし member がリンクであれば、ファイル風のオブジェクトをリンクのターゲットから構成します。もし member が上のどれでもなければ、 `None` が返されます。

  ノート

  ファイル風のオブジェクトは読み出し専用です。このオブジェクトは `read()`, `readline()`, `readlines()`, `seek()`, `tell()`, `close()`. の各メソッドを提供し、行に対するイテレーションをサポートします。

`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` オブジェクトはアーカイブから除外されます。 例 にある例を参照してください。

  バージョン 2.6 で変更: exclude 引数が追加されました。

  バージョン 2.7 で変更: filter 引数が追加されました。

  バージョン 2.7 で撤廃: exclude 引数は廃止予定です。代わりに filter 引数を利用してください。 将来 exclude 引数が削除されたときに互換性を保つため、 filter は位置引数ではなくてキーワード引数として利用するべきです。

`TarFile.` `addfile`(tarinfo, fileobj=None)

  `TarInfo` オブジェクト tarinfo をアーカイブに追加します。もし fileobj が与えられていれば、 `tarinfo.size` バイトがそれから読まれ、アーカイブに追加されます。 `gettarinfo()` を使って `TarInfo` オブジェクトを作成することができます。

  ノート

  Windows プラットフォームでは、 fileobj は、ファイルサイズに関する問題を避けるために、常に、モード `'rb'` でオープンされるべきです。

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

  ファイル name あるいはファイルオブジェクト fileobj のどちらかに対して (そのファイル記述子に `os.fstat()` を使って) `TarInfo` オブジェクトを作成します。 `TarInfo` の属性のいくつかは、 `addfile()` を使って追加する前に修正することができます。もし arcname が与えられていれば、アーカイブ内のファイルの代替名を指定します。

`TarFile.` `close`()

  `TarFile` をクローズします。書き出しモードでは、完了ゼロブロックが 2つ、アーカイブに追加されます。

`TarFile.` `posix`

  この値を `True` にすることは、 `format` を `USTAR_FORMAT` にすることと同じです。この値を `False` にすることは、 `format` を `GNU_FORMAT` にすることと同じです。

  バージョン 2.4 で変更: posix のデフォルト値が `False` になりました.

  バージョン 2.6 で撤廃: 代わりに `format` 属性を利用してください。

`TarFile.` `pax_headers`

  pax グローバルヘッダに含まれる key-value ペアの辞書

  バージョン 2.6 で追加.

## 12.5.2. TarInfo オブジェクト

`TarInfo` オブジェクトは `TarFile` の一つのメンバーを表します。ファイルに必要な(ファイルタイプ、ファイルサイズ、時刻、パーミッション、所有者等のような)すべての属性を保存する他に、そのタイプを決定するのに役に立ついくつかのメソッドを提供します。これにはファイルのデータそのものは 含まれません 。

`TarInfo` オブジェクトは `TarFile` のメソッド `getmember()` 、 `getmembers()` および `gettarinfo()` によって返されます。

class `tarfile.` `TarInfo`(name="")

  `TarInfo` オブジェクトを作成します。

`TarInfo.` `frombuf`(buf)

  `TarInfo` オブジェクトを文字列バッファ buf から作成して返します。

  バージョン 2.6 で追加: バッファが不正な場合は、 `HeaderError` を送出します。

`TarInfo.` `fromtarfile`(tarfile)

  `TarFile` オブジェクトの tarfile から、次のメンバを読み込んで、それを `TarInfo` オブジェクトとして返します。

  バージョン 2.6 で追加.

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

  `TarInfo` オブジェクトから文字列バッファを作成します。引数についての情報は、 `TarFile` クラスのコンストラクタを参照してください。

  バージョン 2.6 で変更: 引数が追加されました。

`TarInfo` オブジェクトには以下の public なデータ属性があります：

`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.` `linkname`

  ターゲットファイル名の名前で、これはタイプ `LNKTYPE` と `SYMTYPE` の `TarInfo` オブジェクトにだけ存在します。

`TarInfo.` `uid`

  ファイルメンバを保存した元のユーザのユーザ ID です。

`TarInfo.` `gid`

  ファイルメンバを保存した元のユーザのグループ ID です。

`TarInfo.` `uname`

  ファイルメンバを保存した元のユーザのユーザ名です。

`TarInfo.` `gname`

  ファイルメンバを保存した元のユーザのグループ名です。

`TarInfo.` `pax_headers`

  pax 拡張ヘッダに関連付けられた、 key-value ペアの辞書。

  バージョン 2.6 で追加.

`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` を返します。

## 12.5.3. 例

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, " は大きさが ", tarinfo.size, "バイトで ",
        if tarinfo.isreg():
            print "普通のファイルです。"
        elif tarinfo.isdir():
            print "ディレクトリです。"
        else:
            print "ファイル・ディレクトリ以外のものです。"
    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()

## 12.5.4. サポートされる tar のフォーマット

`tarfile` モジュールは、3つの tar フォーマットを作成することができます。

- POSIX.1-1988 ustar format (`USTAR_FORMAT`). ファイル名の長さは256文字までで、リンク名の長さは100文字までです。最大のファイルサイズは8GBです。このフォーマットは古くて制限が多いですが、広くサポートされています。

- GNU tar format (`GNU_FORMAT`). 長いファイル名とリンク名、8GBを超えるファイルやスパース(sparse)ファイルをサポートしています。これは GNU/Linux システムにおいて、デ・ファクト・スタンダードになっています。 `tarfile` モジュールは長いファイル名を完全にサポートしています。スパースファイルは読み込みのみサポートしています。

- The POSIX.1-2001 pax format (`PAX_FORMAT`). 一番柔軟性があり、ほぼ制限が無いフォーマットです。長いファイル名やリンク名、大きいファイルをサポートし、パス名をポータブルな方法で保存します。しかし、現在のところ、全ての tar の実装が pax フォーマットを正しく扱えるわけではありません。

  pax フォーマットは既存の ustar フォーマットの拡張です。 ustar では保存できない情報を追加のヘッダを利用して保存します。 pax には2種類のヘッダがあります。 1つ目は拡張ヘッダで、その次のファイルヘッダに影響します。 2つ目はグローバルヘッダで、アーカイブ全体に対して有効で、それ以降の全てのファイルに影響します。全ての pax ヘッダの内容は、ポータブル性のために UTF-8 で保存されます。

他にも、読み込みのみサポートしている tar フォーマットが幾つかあります。

- ancient V7 format. これは Unix 7th Edition から存在する、最初の tar フォーマットです。通常のファイルとディレクトリのみ保存します。名前は100文字を超えてはならず、ユーザー/グループ名に関する情報は保存されません。幾つかのアーカイブは、フィールドがASCIIでない文字を含む場合に、ヘッダのチェックサムの計算を誤っています。

- The SunOS tar extended format. POSIX.1-2001 pax フォーマットの亜流ですが、互換性がありません。

## 12.5.5. Unicode に関する問題

tarフォーマットはもともと、テープドライブにファイルシステムのバックアップを取る目的で設計されました。現在、tarアーカイブはファイルを配布する場合に一般的に用いられ、ネットワークごしに送受信されます。オリジナルのフォーマットの抱える1つの問題(ほか多くのフォーマットも同じですが)は、文字エンコーディングが異なる環境を考慮していないことです。例えば、通常の UTF-8 の環境で作成されたアーカイブは、非ASCII文字を含んでいた場合 Latin-1 のシステムでは正しく読み込むことができません。非ASCII文字を含む名前(ファイル名、リンク名、ユーザー/グループ名)が破壊されます。不幸なことに、アーカイブのエンコーディングを自動検出する方法はありません。

pax フォーマットはこの問題を解決するように設計されました。このフォーマットは、非ASCII文字の名前を UTF-8 で保存します。 pax アーカイブを読み込むときに、この UTF-8 の名前がローカルのファイルシステムのエンコーディングに変換されます。

unicode 変換の動作は、 `TarFile` クラスの encoding と errors キーワード引数によって制御されます。

encoding のデフォルト値はローカルの文字エンコーディングです。これは `sys.getfilesystemencoding()` と `sys.getdefaultencoding()` から取得されます。読み込みモードでは、 encoding は pax フォーマット内の unicode の名前をローカルの文字エンコーディングに変換するために利用されます。書き込みモードでは、 encoding の扱いは選択されたアーカイブフォーマットに依存します。 `PAX_FORMAT` の場合、入力された非ASCII文字を含む文字は UTF-8 文字列として保存する前に一旦デコードする必要があるので、そこで encoding が利用されます。それ以外のフォーマットでは、 encoding は、入力された名前に unicode が含まれない限りは利用されません。unicodeが含まれている場合、アーカイブに保存する前に encoding でエンコードされます。

errors 引数は、 encoding を利用して変換できない文字の扱いを指定します。利用可能な値は、 Codec 基底クラス 節でリストアップされています。読み込みモードでは、追加の値として `'utf-8'` を選択することができ、エラーが発生したときは UTF-8 を利用することができます。(これがデフォルトです) 書き込みモードでは、 errors のデフォルト値は `'strict'` になっていて、名前が気づかないうちに変化することが無いようにしています。

### ナビゲーション

- 索引
- モジュール |
- 次へ |
- 前へ |
- Python 2.7ja1 documentation »
- Python 標準ライブラリ »
- 12. データ圧縮とアーカイブ »