【Python】テキストファイルを読み書きモードで新規作成して開く(モードw+, w+t)【入門第65回】
目次
テキストファイルを新規作成して読み書きする
前【Python】テキストファイルを読み書きモードで開く(モードr+, r+t)【入門第64回】
次【Python】テキストファイルを読み書きモードで、新規作成して、排他的に開く(モードx+, x+t)【入門第66回】
こんにちは、narupoです。
今回も前回に引き続き、Pythonのファイル入出力についてです。
今回はテキストファイルを読み書きモードで新規作成して開く方法を解説します。
テキストファイルを読み書きモードで新規作成して開くには、open
関数のmode
引数に文字列w+
またはw+t
を指定します。
w+
またはw+t
モードのopen
関数から得られるファイルオブジェクトは_io.TextIOWrapper
です。
このファイルオブジェクトのメソッドを使うとテキストファイルに文字列を書き込むことが出来ます。
今回は具体的には↓を見ていきます。
テキストファイルを読み書きモードで新規作成して開く
ファイルオブジェクトのタイプ
文字列を読み込む
文字列を書き込む
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【Python】ファイルを開いて閉じる。open関数の使い方【入門第54回】
- 【Python】テキストファイルの読み込み(モードr, rt)【入門第55回】
- 【Python】テキストファイルへの書き込み(モードw, wt)【入門第56回】
- 【Python】テキストファイルへの追記(モードa, at)【入門第57回】
- 【Python】テキストファイルを排他的に開いて書き込む(モードx, xt)【入門第58回】
- 【Python】バイナリファイルの読み込み(モードrb)【入門第59回】
- 【Python】バイナリファイルへの書き込み(モードwb)【入門第60回】
- 【Python】バイナリファイルへの追記(モードab)【入門第61回】
- 【Python】バイナリファイルを排他的に開いて書き込む(モードxb)【入門第62回】
- 【Python】テキストファイルを読み書きモードで開く(モードr+, r+t)【入門第63回】
- 【Python】テキストファイルを読み書きモードで新規作成して開く(モードw+, w+t)【入門第64回】
- 【Python】テキストファイルを読み書きモードで、新規作成して、排他的に開く(モードx+, x+t)【入門第65回】
- 【Python】バイナリファイルを読み書きモードで開く(モードr+b)【入門第66回】
- 【Python】バイナリファイルを読み書きモードで新規作成して開く(モードw+b)【入門第67回】
- 【Python】バイナリファイルを読み書きモードで排他的に開く(モードx+b)【入門第68回】
- 【Python】テキストファイルを読み書きモードで追記する(モードa+)【入門第69回】
- 【Python】バイナリファイルを読み書きモードで追記する(モードa+b)【入門第70回】
- 【Python】バイナリファイルのランダムアクセスの基本・前編【入門第71回】
- 【Python】バイナリファイルのランダムアクセスの基本・後編【入門第72回】
- 【Python】ランダムアクセスによる固定長レコードの読み書き・前編【入門第73回】
テキストファイルを読み書きモードで新規作成して開く
テキストファイルを読み書きモードで、かつ新規作成して開くにはopen
関数を↓のようにして使います。
:::python
with open('animals.txt', mode='w+', encoding='utf-8') as fp:
pass
open
関数の第1引数に開きたいテキストファイルのパスを指定します。
mode
引数に文字列w+
またはw+t
を指定します。
encoding
には開くテキストファイルのエンコーディングを指定します。
w+
またはw+t
モードは、ファイルが存在しない場合はファイルを新規作成してファイルを開きます。
そして、ファイルが既に存在する場合は、そのファイルの内容を空にしてからファイルを開きます。
特徴としてはw
またはwt
と同じ特徴を持っているので、大切なデータが入っているファイルを誤って空にしないように注意してください。
その他、open
関数の詳しい使い方については↓の記事をご覧ください。
ファイルオブジェクトのタイプ
w+
またはw+t
モードで開いたテキストファイルのファイルオブジェクトのタイプは_io.TextIOWrapper
です。
:::python
with open('animals.txt', mode='w+', encoding='utf-8') as fp:
print(type(fp))
↑のコードの実行結果は↓のようになります。
:::text
<class '_io.TextIOWrapper'>
このTextIOWrapper
はTextIOBase
を継承したクラスです。
さらにTextIOBase
はIOBase
を継承しています。
TextIOBase
とIOBase
の公式ドキュメントを見ればこのファイルオブジェクトで使えるメソッドを一望できます。
- io --- ストリームを扱うコアツール - TextIOBase — Python 3.7.4 ドキュメント
- io --- ストリームを扱うコアツール - IOBase — Python 3.7.4 ドキュメント
文字列を書き込む
ファイルオブジェクトのメソッドを使うとファイルを読み書き出来ます。
ファイルに文字列を書き込むにはwrite
メソッドなどを使います。
:::python
with open('animals.txt', mode='w+', encoding='utf-8') as fp:
fp.write('猫\n')
↑のコードを実行すると↓のような内容のanimals.txt
が作成されます。
:::text
猫
その他の書き込み用のメソッドについては↓の記事をご覧ください。
文字列を読み込む
ファイルから文字列を読み込むにはread
メソッドなどを使います。
:::python
with open('animals.txt', mode='w+', encoding='utf-8') as fp:
content = fp.read()
print(content)
↑のコードを実行した場合、content
の中身は空の文字列です。
ファイルの中身が空だからですね。
↓のように書きこんでからread
してみるとどうでしょうか。
:::python
with open('animals.txt', mode='w+', encoding='utf-8') as fp:
# 1行書き込む
fp.write('猫\n')
# 1行読み込む?
content = fp.read()
print(content)
↑これもcontent
の中身は空になります。
これの原因は、ファイルのオフセット位置です。
write
メソッドは書き込むときにファイルのオフセット位置を書き込んだ分進めます。
そのため、↑のコードではwrite
メソッドを呼び出した直後のファイルのオフセット位置はファイル終端(EOF)になっています。
ファイル終端からread
をした場合、読み込む文字列が無いのでread
の返す値は空の文字列になります。
↓のようにwrite
のあとにファイルのオフセット位置をファイル先頭に戻すと、read
で1行読み込めます。
:::python
import os
with open('animals.txt', mode='w+', encoding='utf-8') as fp:
# 1行書き込む
fp.write('猫\n')
# オフセット位置をファイル先頭に戻す
fp.seek(0, os.SEEK_SET)
# 1行読み込む
content = fp.read()
print(content)
↑のコードの実行結果は↓のようになります。
:::text
猫
↓のようにファイルのオフセット位置を操作するにはseek
メソッドを使います。
:::python
fp.seek(0, os.SEEK_SET)
seekメソッドの第1引数には第2引数からの相対位置を、第2引数には基点位置を指定します。
os.SEEK_SET
はファイル先頭を表す定数です。
つまり、ファイル先頭(SEEK_SET
)から0
の位置にシークする……オフセット位置を移動するということですね。
このように、w+
またはw+t
モードでテキストファイルを開いて読み込む場合、オフセット位置をシークする必要が出てきます。
この辺はw+
またはw+t
モードの特徴と言えます。
その他、読み込み用のメソッドについては↓の記事をご覧ください。
おわりに
w+
とr+
の大きな違いは、w+
はファイルを空にして開き、r+
はファイルが存在しない場合はエラーを出す点です。
良い感じで両者を使い分けるようにすると良さそうですね。
また、今回もランダムアクセスについてちょろっとやりました。
以上、次回に続きます。
また見てね
前【Python】テキストファイルを読み書きモードで開く(モードr+, r+t)【入門第64回】
次【Python】テキストファイルを読み書きモードで、新規作成して、排他的に開く(モードx+, x+t)【入門第66回】