【Python】ファイル入出力の基本

Python のファイル入出力の基本について解説します。
Pythonのファイル入出力
Python でのファイル入出力は、ファイルを開いてデータを読み書きする基本的な操作です。Python にはファイル入出力用の様々な関数やメソッドが用意されており、簡単に処理を実行できます。
この記事では、Python のファイル入出力の基本となる各種関数・メソッドの使い方や with による自動ファイルクローズなど基本を紹介します。
ファイル入出力の手順
ファイル入出力の基本的な手順は以下のような流れとなります。
open関数でファイルを開く。read/readlineメソッドでデータを読み込む、またはwrite/writelinesメソッドでデータを書き込む。closeメソッドでファイルを閉じる。
テキストファイルへの書き込み例で、流れを確認してみましょう。
input_text = "サンプル"
# ファイルを開く(オープン)
file = open("sample.txt", "w+", encoding="utf-8")
# 文字列の書き込み
file.write(input_text)
# ファイルを閉じる(クローズ)
file.close()open 関数では、ファイルパス、モード、文字コードを指定します。例では、write でinput_text に格納した文字列をファイルに書き込み、close で閉じています。読み込みの場合は、メソッドが変わるだけで流れは同じです。
close を忘れるとファイルが占有されたままとなり、他のプログラムがアクセスできなくなる可能性がありますので注意が必要です。なお、後述する with を使うと、自動的にファイルを閉じることができます。
ファイルのモード(mode)
ファイルの入出力ではモード(mode)を指定することで挙動の制御ができます。
主なモードは以下の通りです。
| mode | 内容 |
|---|---|
r | 読み込み専用 (ファイルが存在しない場合はエラー) |
r+ | 読み書き両用 (ファイルが存在しない場合はエラー) |
w | 書き込み専用 (ファイルが存在しない場合は新規作成) |
w+ | 読み書き両用 (オープン時に内容をクリア、ファイルが存在しない場合は新規作成) |
a | 追記専用 (ファイルが存在する場合に末尾に追記、ファイルが存在しない場合は新規作成) |
a+ | 読み書き両用 (ファイルが存在する場合に末尾に追記、ファイルが存在しない場合は新規作成) |
b | バイナリモード ( rb、wb のように r や w と併用) |
w モードは書き込むたびに内容が上書きされるため注意が必要です。ログファイルのように追記する場合は a、a+ モードを使用します。
with による自動クローズ
ファイルを開いたら、不要になった時点で close する必要があります。しかし、コードが複雑で長くなるとクローズを忘れる可能性があることから、ファイルのオープン時間は短く保つことが推奨されます。
これらの問題を解決するために with を使用します。with を使用するとブロックが終了した時点で自動的にファイルがクローズされます。
input_text = "サンプル"
# withでopenを実行する
with open("sample.txt", "w+", encoding="utf-8") as file:
# 文字列の書き込み
file.write(input_text)例では、文字列の書き込みの write が終わったら自動でファイルをクローズするため、close 忘れを防止できます。特に理由がない限りは積極的に with を使用するようにしましょう。
プログラミングでは不要になったらリソースを開放するのが基本です。C/C++ 言語などの他言語では、メモリも同様に確保・解放を行う必要があります。プログラマとしては、使い終わったものは片づける意識を持つように意識しましょう。
テキストファイルの入出力
テキストファイルの入出力方法について基本となる実装例を紹介します。
テキストファイルの読み込み
ファイル内容をまとめて取得する read
ファイル全体の内容をまとめて取得するには read メソッドを使用します。
以下は、事前に用意した sample_text.txt の内容をまとめて読み込んで表示する例です。任意のファイルを用意して試してみてください。
with open("sample_text.txt", "r", encoding="utf-8") as file:
data = file.read()
print(data)【実行結果】 Python ファイルの入出力の基本 テキストファイルの入出力
ファイル内容を 1 文字ずつ取得する read(1)
ファイル内容を 1 文字ずつ読み込むには read(1) で順次読み込みます。
with open("sample_text.txt", "r", encoding="utf-8") as file:
data = []
# 一文字ずつ読み込む
while d := file.read(1):
data.append(d)
print(data, "\n")
data_str = "".join(data)
print(data_str)【実行結果】 ['P', 'y', 't', 'h', 'o', 'n', '\n', 'フ', 'ァ', 'イ', 'ル', 'の', '入', '出', '力', 'の', '基', '本', '\n', 'テ', 'キ', 'ス', 'ト', 'フ', 'ァ', 'イ', 'ル', 'の', '入', '出', '力'] Python ファイルの入出力の基本 テキストファイルの入出力
この例では、1 文字ずつリストに格納し "".join(data) で結合しています。リストの結合は「リストを結合して文字列にする方法 ~ join ~」を参考にしてください。
ファイルの内容を 1 行ずつ取得する readline
ファイルの内容を 1 行ずつリストで取得するには readlines メソッドを使用します。
with open("sample_text.txt", "r", encoding="utf-8") as file:
# 1行ずつデータを読み出す
data = file.readlines()
print(data, "\n")
# 取得したデータを出力
for line in data:
print(line, end="")【実行結果】 ['Python\n', 'ファイルの入出力の基本\n', 'テキストファイルの入出力'] Python ファイルの入出力の基本 テキストファイルの入出力
readlines で取得した各行の末尾には改行が入っているため、そのまま print すると余計な改行が入ってしまいます。例では、余計な改行で見にくくならないように print(line, end="") としています。
順次 1 行ずつ取得して処理する場合
readlines 以外にも open したオブジェクトを使って、以下のように直接 for ループで処理することで 1 行ずつ読み込むことも可能です。
# for文で順次取り出す方法
with open("sample_text.txt", "r", encoding="utf-8") as file:
for line in file:
print(line, end="")テキストファイルへの書き込み
文字列をテキストファイルへ書き込む write
文字列をテキストファイルを書き込むには、write メソッドを使用します。
data = "Python\nファイルの入出力の基本\nテキストファイルの入出力"
# テキストファイルの書き込み
with open("sample_text_out_str.txt", "w+", encoding="utf-8") as file:
file.write(data)例では "w+" の書き込みモードでファイルを open し、write メソッドに文字列を渡しています。出力先の sample_text_out_str.txt には以下が書き込まれます。
Python ファイルの入出力の基本 テキストファイルの入出力
文字列リストをまとめてテキストファイルへ書き込む writelines
文字列リストをまとめて書き込むには、writelines メソッドを使用します。
data = [
"Python\n",
"ファイルの入出力の基本\n",
"テキストファイルの入出力",
]
# テキストファイルの書き込み
with open("sample_text_out_list.txt", "w+", encoding="utf-8") as file:
file.writelines(data)writelines にリストを指定することでファイル出力が可能です。なお、各文字列ごとに改行したい場合は、リスト内の各文字列の末尾に "\n" を含める必要があります。
バイナリファイルの入出力
画像などのバイナリファイルの入出力の例を紹介します。
バイナリファイルの読み込み
ファイル内容をまとめて取得する read
"rb" モードでバイナリファイルを開き、read メソッドで読み込みます。
with open("sample_binary.png", "rb") as file:
data = file.read()
print(data)【実行結果例】 b'\x89PNG\r\n\x1a\n\x00\x00\x00(・・・中略・・・)\xaeB`\x82'
ファイル内容を 1 バイトずつ取得する read(1)
バイナリファイルを 1 バイトずつ読み込むには read(1) として読み込みます。
with open("sample_binary.png", "rb") as file:
data = []
while d := file.read(1):
data.append(d)
print(data, "\n")
data_bin = b"".join(data)
print(data_bin)【実行結果】 [b'\x89', b'P', b'N', b'G', b'\r', b'\n', b'\x1a', b'\n', b'\x00', b'\x00', b'\x00',(・・・中略・・・), b'\xae', b'B', b'`', b'\x82'] b'\x89PNG\r\n\x1a\n\x00\x00\x00(・・・中略・・・)\xaeB`\x82'
バイナリファイルへの書き込み
データをバイナリファイルへ書き込む write
"wb" モードでバイナリデータを開き、write メソッドで書き込みます。
with open("sample_binary.png", "rb") as file:
data = file.read()
# バイナリファイルの書き込み
with open("sample_binary_out.png", "wb") as file:
file.write(data)例では、バイナリファイルを読み込み、別名でコピーとして書き込んでいます。
まとめ
Python のファイル入出力の基本について解説しました。
ファイル入出力の基本的な流れは以下のようになります。
open関数でファイルを開く。read/readlineメソッドでデータを読み込む、またはwrite/writelinesメソッドでデータを書き込む。closeメソッドでファイルを閉じる。
close 忘れを防止するには with を使うと自動的にファイルクローズができます。また、open、close、read、readlines、write、writelines といった各種関数・メソッドの使い方を説明しました。
ファイル入出力はプログラミングの基本であるため、しっかり使いこなせるようになりましょう。
上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。



