Pythonのファイル入出力に関わる関数・メソッド(open
、close
、read
、readlines
、write
、writelines
)やwith
の使い方について解説します。
Pythonのファイル入出力
Pythonでのファイル入出力は、ファイルを開いてデータを読み書きする基本的な操作です。Pythonにはファイル入出力用の関数やメソッドが用意されており、簡単に処理を実行できます。
この記事では、open
、close
、read
、readlines
、write
、writelines
などのファイル操作や、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
で文字列を書き込み、close
でファイルを閉じています。読み込みの場合は、メソッドが変わるだけで流れは同じです。
close
を忘れるとファイルが占有されたままとなり、他のプログラムがアクセスできなくなる可能性があります。なお、後述するwith
を使うと、自動的にファイルを閉じることができるので安心です。
ファイルのモード(mode
)
ファイルの入出力には、open
時にモード(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)
with
を使うとclose
忘れを防止できます。ファイル入出力では積極的にwith
を使いましょう。
なお、with
…as
はコンテキストマネージャーと呼ばれる仕組みで独自に実装することも可能です。詳細は「コンテキストマネージャーの基本 ~ with…as命令にオブジェクトを渡すには ~」を参考にしてください。
プログラミングでは不要になったらリソースを開放するのが基本です。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 ~」を参考にしてください。
上記の「:=
」は、Python 3.8で導入された「セイウチ(Walrus)演算子」です。変数への代入と評価を同時に行います。公式ドキュメントはこちらを参照ください。
ファイルの内容を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(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
read
メソッドを使用して、"rb"
モードでバイナリファイルを読み込みます。
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
write
メソッドを使用して、"wb"
モードでバイナリデータを書き込みます。以下の例では、バイナリファイルを読み込み、別名でコピーしています。
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
、close
、read
、readlines
、write
、writelines
)やwith
の使い方を解説しました。
ファイル入出力の基本的な流れは以下の通りです。
- ファイルを
open
で開く - 必要な操作を行う(読み込み、各種処理、書き込み)
close
でファイルを閉じる
close
忘れによる問題を防ぐためには、with
を使うと自動的にファイルクローズできることも紹介しました。
ファイルの入出力はプログラミングの基本ですので、しっかり使いこなせるようになっておきましょう。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。