【Python】テキストファイルを排他的に開いて書き込む(モードx, xt)【入門第59回】

182, 2019-09-18

目次

テキストファイルの排他的な処理

こんにちは、narupoです。

今回も前回に引き続きPythonのファイル入出力についてです。
今回はテキストファイルを排他的に開いて書き込む方法を解説します。
Pythonでテキストファイルを排他的に開くにはopen関数のモード引数にxまたはxtを指定します。
モードxまたはxtを指定するとopen関数はファイルを新規作成して開こうとします。
その際、既にファイルが存在している場合、open関数はFileExistsErrorを送出します。
開かれたファイルオブジェクトは書き込み専用になっているので、メソッドを使って文字列を書き込むことが出来ます。

具体的には↓を見ていきます。

  • そもそも「排他的」って何?

  • テキストファイルを排他的に開く

  • ファイルオブジェクトのタイプ

  • ファイルが読み書きできるか確認する

  • writeメソッドで文字列を書き込む

  • writelinesメソッドで文字列のリストを書き込む

ほかのファイル入出力についての入門記事は↓をご覧ください。

そもそも「排他的」って何?

排他的(はいたてき)とは一体どういう意味なのか、というところからなんですが、辞書では「排他的」は↓のように定義されています。

[形動]排他の傾向があるさま。「排他的な土地柄」

排他的(はいたてき)の意味 - goo国語辞書

「排他」は↓です。

自分の仲間以外の者すべてをしりぞけて受け入れないこと。「排他主義」

排他(はいた)の意味 - goo国語辞書

open関数のモードxの排他的の意味は「新規ファイルを排他的に作成する」という意味です。
さらに言い換えると「新規作成するファイルがすでに存在する場合はエラーを出す」という意味になります。
「排他的」という用語がちょっと混乱しますが、やってることはいたってシンプルなわけですね。

排他的にされて吐いた

おいおい

テキストファイルを排他的に開く

テキストファイルを排他的に開くには↓のようにします。

with open('animals.txt', mode='x', encoding='utf-8') as fout:
    pass

open関数の第1引数には新規作成するファイルのパスを指定します。

modeには文字列のxxtを指定します。
xeXclusive(排他的)のxで、xteXclusive Textの略です。

encodingには作成するファイルのエンコーディングを指定します。
Windows環境のopen関数はデフォルトでcp932エンコーディングでファイルを開こうとします。
そのためファイルをutf-8で保存したい場合はencoding引数にutf-8を指定するようにしてください。
Linux環境ではopen関数はデフォルトでファイルをutf-8で開くはずです。

open関数について詳しく知りたい方は↓の記事をご覧ください。

↑の記事ではエンコーディングについても解説しています。
エンコーディングについてよくわからないという方は、とりあえず書いているスクリプトや取り扱うファイルをutf-8で統一するようにしてください。
最近はファイルはutf-8で取り扱うのが普通になってきています。

まだまだShift-JISとかEUC-JPとかあるけどね

テキストファイルを排他的に開く場合、open関数はテキストファイルを新規作成してファイルを開こうとします
すでにファイルが存在している場合はopen関数は例外FileExistsErrorを送出します。

try:
    with open('animals.txt', mode='x', encoding='utf-8') as fout:
        pass
except FileExistsError:
    print('ファイルが既に存在します')

ファイルオブジェクトのタイプ

モードxまたはxtで開いたファイルオブジェクトのタイプは_io.TextIOWrapperです。

with open('animals.txt', mode='x', encoding='utf-8') as fout:
    print(type(fout))

↑のコードの実行結果は↓のようになります。

<class '_io.TextIOWrapper'>

このTextIOWrapperTextIOBaseを継承したクラスです。
さらにTextIOBaseIOBaseを継承しています。
TextIOBaseIOBaseの公式ドキュメントを見ればこのファイルオブジェクトで使えるメソッドを一望できます。

ファイルが読み書きできるか確認する

排他的に開いたテキストファイルで読み込みと書き込みが出来るか確認してみましょう。
ファイルオブジェクトが読み込み可能かどうかチェックするにはreadableメソッドを使います。
readableメソッドはファイルオブジェクトが読み込み可能な時にTrue, 読み込み不可能な時にFalseを返します。

with open('animals.txt', mode='x', encoding='utf-8') as fout:
    print(fout.readable())

↑のコードの実行結果は↓のようになります。

False

↑の結果からxモードで開いたファイルオブジェクトは読み込み不可能なことがわかります。

ファイルオブジェクトが書き込み可能かどうかチェックするにはwritableメソッドを使います。
writableメソッドはファイルオブジェクトが書き込み可能な時にTrue, 書き込み不可能な時にFalseを返します。

with open('animals.txt', mode='x', encoding='utf-8') as fout:
    print(fout.writable())

↑のコードの実行結果は↓のようになります。

True

↑の結果からxモードで開いたファイルオブジェクトは書き込み可能なことがわかります。

writeメソッドで文字列を書き込む

排他的に開いたテキストファイルへ文字列を書き込むにはファイルオブジェクトのwriteメソッドを使います。

with open('animals.txt', mode='x', encoding='utf-8') as fout:
    fout.write('オオアリクリ\n')

writeメソッドの詳細については↓の記事をご覧ください。

writelinesメソッドで文字列のリストを書き込む

排他的に開いたテキストファイルへ文字列のリストを書き込むにはファイルオブジェクトのwritelinesメソッドを使います。

lines = [
    'ナウマンゾウ\n',
    'ヌー\n',
    'カバ\n',
]

with open('animals.txt', mode='x', encoding='utf-8') as fout:
    fout.writelines(lines)

writelinesメソッドの詳細については↓の記事をご覧ください。

おわりに

テキストファイルを排他的に開けるようになると、より詳細なプログラムを書くことが出来ます。
ファイルが既に存在しているのはおかしい、といったケースなどに役立てるでしょう。
ファイルが既に存在しているか強制的にチェックできれば、プログラムのミスによる意図しないファイルへの上書きなどを予防することが出来ます。

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク