入出力

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

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

Python のファイル入出力の基本について解説します。

Pythonのファイル入出力

Python でのファイル入出力は、ファイルを開いてデータを読み書きする基本的な操作です。Python にはファイル入出力用の様々な関数やメソッドが用意されており、簡単に処理を実行できます。

この記事では、Python のファイル入出力の基本となる各種関数・メソッドの使い方や with による自動ファイルクローズなど基本を紹介します。

ファイル入出力の手順

ファイル入出力の基本的な手順は以下のような流れとなります。

  1. open 関数でファイルを開く。
  2. read / readline メソッドでデータを読み込む、または write / writelines メソッドでデータを書き込む。
  3. close メソッドでファイルを閉じる。

テキストファイルへの書き込み例で、流れを確認してみましょう。

input_text = "サンプル"

# ファイルを開く(オープン)
file = open("sample.txt", "w+", encoding="utf-8")
# 文字列の書き込み
file.write(input_text)
# ファイルを閉じる(クローズ)
file.close()

open 関数では、ファイルパス、モード、文字コードを指定します。例では、writeinput_text に格納した文字列をファイルに書き込み、close で閉じています。読み込みの場合は、メソッドが変わるだけで流れは同じです。

close を忘れるとファイルが占有されたままとなり、他のプログラムがアクセスできなくなる可能性がありますので注意が必要です。なお、後述する with を使うと、自動的にファイルを閉じることができます。

ファイルのモード(mode

ファイルの入出力ではモード(modeを指定することで挙動の制御ができます。

主なモードは以下の通りです。

mode内容
r読み込み専用
(ファイルが存在しない場合はエラー)
r+読み書き両用
(ファイルが存在しない場合はエラー)
w書き込み専用
(ファイルが存在しない場合は新規作成)
w+読み書き両用
(オープン時に内容をクリア、ファイルが存在しない場合は新規作成)
a追記専用
(ファイルが存在する場合に末尾に追記、ファイルが存在しない場合は新規作成)
a+読み書き両用
(ファイルが存在する場合に末尾に追記、ファイルが存在しない場合は新規作成)
bバイナリモード
rbwb のように rw と併用)

w モードは書き込むたびに内容が上書きされるため注意が必要です。ログファイルのように追記する場合は aa+ モードを使用します。

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++ 言語などの他言語では、メモリも同様に確保・解放を行う必要があります。プログラマとしては、使い終わったものは片づける意識を持つように意識しましょう。

【コンテキストマネージャー】

with ... as ... は、コンテキストマネージャーと呼ばれる仕組みを使っています。コンテキストマネージャーは独自に実装することも可能です。以下を参考にしてください。

コンテキストマネージャーの基本

テキストファイルの入出力

テキストファイルの入出力方法について基本となる実装例を紹介します。

テキストファイルの読み込み

ファイル内容をまとめて取得する 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 ~」を参考にしてください。

【セイウチ (Walrus) 演算子】

:=」は、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 すると余計な改行が入ってしまいます。例では、余計な改行で見にくくならないように 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 のファイル入出力の基本について解説しました。

ファイル入出力の基本的な流れは以下のようになります。

  1. open 関数でファイルを開く。
  2. read / readline メソッドでデータを読み込む、または write / writelines メソッドでデータを書き込む。
  3. close メソッドでファイルを閉じる。

close 忘れを防止するには with を使うと自動的にファイルクローズができます。また、openclosereadreadlineswritewritelines といった各種関数・メソッドの使い方を説明しました。

ファイル入出力はプログラミングの基本であるため、しっかり使いこなせるようになりましょう。

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました