12.5. tarfile
--- tar アーカイブファイルの読み書き¶
バージョン 2.3 で追加.
ソースコード: Lib/tarfile.py
tarfile
モジュールは、gzip、bz2 圧縮されたものを含む、tar アーカイブを読み書きできます。.zip
ファイルの読み書きには zipfile
モジュールか、あるいは shutil の高レベル関数を使用してください。
いくつかの事実と形態:
POSIX.1-1988 (ustar) フォーマットの読み書きをサポートしています。
longname, longlink 拡張を含む GNU tar フォーマットの読み書きをサポートしています。 sparse 拡張は読み込みのみサポートしています。
POSIX.1-2001 (pax) フォーマットの読み書きをサポートしています。
バージョン 2.6 で追加.
ディレクトリ、一般ファイル、ハードリンク、シンボリックリンク、fifo、キャラクターデバイスおよびブロックデバイスを処理します。また、タイムスタンプ、アクセス許可や所有者のようなファイル情報の取得および保存が可能です。
注釈
Handling of multi-stream bzip2 files is not supported. Modules such as bz2file let you overcome this.
-
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 圧縮で読み込み用にオープンします。
'a' または 'a:'
非圧縮で追記用にオープンします。ファイルが存在しない場合は新たに作成されます。
'w' または 'w:'
非圧縮で書き込み用にオープンします。
'w:gz'
gzip 圧縮で書き込み用にオープンします。
'w:bz2'
bzip2 圧縮で書き込み用にオープンします。
'a:gz'
、'a:bz2'
は利用できないことに注意して下さい。もし mode が、ある (圧縮した) ファイルを読み込み用にオープンするのに適していないなら、ReadError
が送出されます。これを防ぐには mode'r'
を使って下さい。もし圧縮方式がサポートされていなければ、CompressionError
が送出されます。もし fileobj が指定されていれば、それは name でオープンされた ファイルオブジェクト の代替として使うことができます。そのファイルオブジェクトの位置が 0 であることを前提に動作します。
'w:gz'
、'r:gz'
、'w:bz2'
、'r:bz2'
モードの場合、tarfile.open()
はファイルの圧縮レベルを指定するキーワード引数 compresslevel (デフォルトは9
) を受け付けます。特別な目的のために、mode には 2 番目の形式:
'ファイルモード|[圧縮方式]'
があります。この形式を使うと、tarfile.open()
が返すのは、データをブロックからなるストリームとして扱うTarFile
オブジェクトになります。この場合、ファイルに対してランダムなシークが行えなくなります。fileobj を指定する場合、read()
およびwrite()
メソッドを持つ (mode に依存した) 任意のオブジェクトにできます。bufsize にはブロックサイズを指定します。デフォルトは20 * 512
バイトです。sys.stdin
、ソケットファイルオブジェクト、あるいはテープデバイスと組み合わせる場合にはこの形式を使ってください。ただし、このようなTarFile
オブジェクトにはランダムアクセスを行えないという制限があります。例 節を参照してください。現在可能なモードは以下のとおりです。モード
動作
'r|*'
tar ブロックの stream を圧縮方法に関して透過的に読み込み用にオープンします。
'r|'
非圧縮 tar ブロックの stream を読み込み用にオープンします。
'r|gz'
gzip 圧縮の stream を読み込み用にオープンします。
'r|bz2'
bzip2 圧縮の stream を読み込み用にオープンします。
'w|'
非圧縮の stream を書き込み用にオープンします。
'w|gz'
gzip 圧縮の stream を書き込み用にオープンします。
'w|bz2'
bzip2 圧縮の stream を書き込み用にオープンします。
-
class
tarfile.
TarFile
¶ tar アーカイブを読み書きするためのクラスです。このクラスを直接使わず、代わりに
tarfile.open()
を使ってください。TarFile オブジェクト を参照してください。
-
class
tarfile.
TarFileCompat
(filename, mode='r', compression=TAR_PLAIN)¶ zipfile
風なインターフェースを持つ tar アーカイブへの制限されたアクセスのためのクラスです。詳細はzipfile
のドキュメントを参照してください。 compression は、以下の定数のどれかでなければなりません:-
TAR_PLAIN
¶ 非圧縮 tar アーカイブのための定数。
バージョン 2.6 で非推奨:
TarFileCompat
クラスは Python 3 で削除されました。-
-
exception
tarfile.
CompressionError
¶ 圧縮方法がサポートされていないか、あるいはデータを正しくデコードできない時に送出されます。
-
exception
tarfile.
ExtractError
¶ TarFile.extract()
を使った時に 致命的でない エラーに対して送出されます。ただしTarFile.errorlevel
== 2
の場合に限ります。
モジュールレベルで以下の定数が利用出来ます。
-
tarfile.
ENCODING
¶ 既定の文字エンコーディング。Windows では
'utf-8'
、それ以外ではsys.getfilesystemencoding()
の返り値です。
-
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
です。
参考
zipfile
モジュールzipfile
標準モジュールのドキュメント。- アーカイブ化操作
shutil
が提供するより高水準のアーカイブ機能についてのドキュメント。- GNU tar manual, Basic Tar Format
GNU tar 拡張機能を含む、tar アーカイブファイルのためのドキュメント。
12.5.1. TarFile オブジェクト¶
TarFile
オブジェクトは、tar アーカイブへのインターフェースを提供します。tar アーカイブは一連のブロックです。アーカイブメンバー (保存されたファイル) は、ヘッダーブロックとそれに続くデータブロックで構成されています。一つの tar アーカイブにファイルを何回も保存することができます。各アーカイブメンバーは、TarInfo
オブジェクトで確認できます。詳細については TarInfo オブジェクト を参照してください。
TarFile
オブジェクトは with
文のコンテキストマネージャーとして利用できます。with ブロックが終了したときにオブジェクトはクローズされます。例外が発生した時、内部で利用されているファイルオブジェクトのみがクローズされ、書き込み用にオープンされたアーカイブのファイナライズは行われないことに注意してください。例 節のユースケースを参照してください。
バージョン 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
だった場合、空の (無効な) ブロックをスキップして、可能な限り多くのメンバーを取得しようとします。このオプションは、連結されたり、壊れたアーカイブファイルを扱うときにのみ、意味があります。debug は
0
(デバッグメッセージ無し) から3
(全デバッグメッセージ) まで設定できます。このメッセージはsys.stderr
に書き込まれます。errorlevel が
0
の場合、TarFile.extract()
使用時にすべてのエラーが無視されます。エラーが無視された場合でも、debug が有効であれば、エラーメッセージは出力されます。 errorlevel が``1`` の場合、すべての 致命的な(fatal) エラーはOSError
またはIOError
を送出します。2
の場合、すべての 致命的でない(non-fatal) エラーもTarError
例外として送出されます。encoding と errors 引数は、文字列と unicode オブジェクトとの間の相互変換方法を指定します。デフォルトの設定で、ほとんどのユーザーでうまく動作するでしょう。詳しい情報は、 Unicode に関する問題 節を参照してください。
バージョン 2.6 で追加.
pax_headers 引数は、オプションの、 unicode 文字列の辞書で、 format が
PAX_FORMAT
だった場合に pax グローバルヘッダに追加されます。バージョン 2.6 で追加.
-
classmethod
TarFile.
open
(...)¶ 代替コンストラクターです。モジュールレベルでの
tarfile.open()
関数は、実際はこのクラスメソッドへのショートカットです。
-
TarFile.
getmember
(name)¶ メンバー name に対する
TarInfo
オブジェクトを返します。name がアーカイブに見つからなければ、KeyError
が送出されます。注釈
アーカイブ内にメンバーが複数ある場合は、最後に出現するものが最新のバージョンとみなされます。
-
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()
の警告を参してください。
-
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
バイトがそれから読まれ、アーカイブに追加されます。TarInfo
オブジェクトは直接もしくはgettarinfo()
を使って作成することができます。注釈
Windows プラットフォームでは、fileobj は、ファイルサイズに関する問題を避けるために、常にモード
'rb'
でオープンするべきです。
-
TarFile.
gettarinfo
(name=None, arcname=None, fileobj=None)¶ os.stat()
の結果か、既存のファイルに相当するものから、TarInfo
オブジェクトを作成します。このファイルは、name で名付けられるか、ファイル記述子を持つ file object fileobj として指定されます。arcname が与えられた場合、アーカイブ内のファイルに対して代替名を指定します。与えられない場合、名前は fileobj のname
属性、もしくは name 引数から取られます。TarInfo
の属性の一部は、addfile()
を使用して追加する前に修正できます。ファイルオブジェクトが、ファイルの先頭にある通常のファイルオブジェクトでない場合、size
などの属性は修正が必要かもしれません。これは、GzipFile
などの属性に当てはまります。name
も修正できるかもしれず、この場合、arcname はダミーの文字列にすることができます。
-
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()
によって返されます。
-
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
オブジェクトには以下のデータ属性があります:
-
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 ペアの辞書。
バージョン 2.6 で追加.
TarInfo
オブジェクトは便利な照会用のメソッドもいくつか提供しています:
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, "is", tarinfo.size, "bytes in size and is",
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()
12.5.4. サポートしている 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 フォーマットの亜流ですが、互換性がありません。
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'
になっていて、名前が気づかないうちに変化することが無いようにしています。