pytho****@googl*****
pytho****@googl*****
2011年 11月 23日 (水) 20:37:33 JST
Revision: a6b64e9f1a4d Author: Naoki INADA <inada****@klab*****> Date: Wed Nov 23 03:36:23 2011 Log: Update 2.7.2: library/tarfile http://code.google.com/p/python-doc-ja/source/detail?r=a6b64e9f1a4d Modified: /library/tarfile.rst ======================================= --- /library/tarfile.rst Sat Mar 26 09:59:10 2011 +++ /library/tarfile.rst Wed Nov 23 03:36:23 2011 @@ -379,10 +379,19 @@ .. object, see :ref:`tarinfo-objects` for details. :class:`TarFile` オブジェクトは、tar アーカイブへのインターフェースを提供し ます。 tar -アーカイブは一連のブロックです。アーカイブメンバー(保存されたファイル)は、 ヘッダーブロックとそれに続くデータブロックから構成されています。ある tar +アーカイブは一連のブロックです。アーカイブメンバー(保存されたファイル)は、 +ヘッダーブロックとそれに続くデータブロックから構成されています。ある tar アーカイブにファイルを何回も保存することができます。各アーカイブメンバー は、 :class:`TarInfo` オブジェクトによって表わされます、詳細については :ref:`tarinfo-objects` を 参照してください。 +:class:`TarFile` オブジェクトは :keyword:`with` 文によりコンテキストマネー ジャーとして +利用できます。 with ブロックが終了したときにオブジェクトは close されます。 +例外が発生した時、内部で利用されているファイルオブジェクトのみが close さ れ、 +開かれたアーカイブは終了されないことに注意してください。 +:ref:`tar-examples` セクションにあるユースケースを参照してください。 + +.. versionadded:: 2.7 + コンテキストマネージャープロトコルがサポートされました。 .. class:: 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) @@ -652,29 +661,34 @@ 行に対するイテレーションをサポートします。 -.. method:: TarFile.add(name, arcname=None, recursive=True, exclude=None) - - .. Add the file *name* to the archive. *name* may be any type of file (directory, - .. fifo, symbolic link, etc.). If given, *arcname* specifies an alternative name - .. for the file in the archive. Directories are added recursively by default. This - .. can be avoided by setting *recursive* to :const:`False`. If *exclude* is given - .. it must be a function that takes one filename argument and returns a boolean - .. value. Depending on this value the respective file is either excluded - .. (:const:`True`) or added (:const:`False`). - - ファイル *name* をアーカイブに追加します。 *name* は、任意のファイルタイ プ (ディレクトリ、fifo、シンボリックリンク等)です。 - もし *arcname* が与えられていれば、それはアーカイブ内のファイルの代替名 を指定します。デフォルトではディレクトリは再帰的に追加されます。 +.. method:: TarFile.add(name, arcname=None, recursive=True, exclude=None, filter=None) + + ファイル *name* をアーカイブに追加します。 + *name* は、任意のファイルタイプ (ディレクトリ、fifo、シンボリックリンク 等)です。 + もし *arcname* が与えられていれば、それはアーカイブ内のファイルの代替名 を指定します。 + デフォルトではディレクトリは再帰的に追加されます。 これは、 *recursive* を :const:`False` に設定することで避けることができ ます。 - *exclude* を指定する場合、それは1つのファイル名を引数にとってブール値を 返す関数である必要があります。 - この関数の戻り値が :const:`True` の場合、そのファイルが除外されま す。 :const:`False` の場合、そのファイルは追加されます。 - - - .. .. versionchanged:: 2.6 - .. Added the *exclude* parameter. + *exclude* を指定する場合、それは1つのファイル名を引数にとってブール値を 返す + 関数である必要があります。 + この関数の戻り値が :const:`True` の場合、そのファイルが除外されます。 + :const:`False` の場合、そのファイルは追加されます。 + *filter* を指定する場合、それは :class:`TarInfo` オブジェクトを引数とし て受け取り、 + 操作した :class:`TarInfo` オブジェクトを返す関数でなければなりません。 + 代わりに :const:`None` を返した場合、 :class:`TarInfo` オブジェクトは + アーカイブから除外されます。 + :ref:`tar-examples` にある例を参照してください。 .. versionchanged:: 2.6 *exclude* 引数が追加されました。 + .. versionchanged:: 2.7 + *filter* 引数が追加されました。 + + .. deprecated:: 2.7 + *exclude* 引数は廃止予定です。代わりに *filter* 引数を利用してくださ い。 + 将来 *exclude* 引数が削除されたときに互換性を保つため、 + *filter* は位置引数ではなくてキーワード引数として利用するべきです。 + .. method:: TarFile.addfile(tarinfo, fileobj=None) @@ -1035,6 +1049,12 @@ tar.add(name) tar.close() +:keyword:`with` 文を利用した同じ例:: + + import tarfile + with tarfile.open("sample.tar", "w") as tar: + for name in ["foo", "bar", "quux"]: + tar.add(name) .. How to read a gzip compressed tar archive and display some member information: @@ -1056,6 +1076,19 @@ tar.close() +:meth:`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-formats: サポートされる tar のフォーマット