入出力

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

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

Pythonのファイル入出力に関わる関数・メソッド(openclosereadreadlineswritewritelines)やwithの使い方について解説します。

Pythonのファイル入出力

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

この記事では、openclosereadreadlineswritewritelinesなどのファイル操作や、withによる自動ファイルクローズについて説明します。

ファイル入出力の手順

ファイル入出力の手順は以下の通りです。

  1. open関数でファイルを開く
  2. readreadlineメソッドでデータを読み込む、またはwritewritelinesメソッドでデータを書き込む
  3. 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のように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)

withを使うとclose忘れを防止できます。ファイル入出力では積極的にwithを使いましょう。

なお、withasはコンテキストマネージャーと呼ばれる仕組みで独自に実装することも可能です。詳細は「コンテキストマネージャーの基本 ~ 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 ~」を参考にしてください。

Note

上記の「:=」は、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でファイル入出力に関わる関数・メソッド(openclosereadreadlineswritewritelines)やwithの使い方を解説しました。

ファイル入出力の基本的な流れは以下の通りです。

  1. ファイルをopenで開く
  2. 必要な操作を行う(読み込み、各種処理、書き込み)
  3. closeでファイルを閉じる

close忘れによる問題を防ぐためには、withを使うと自動的にファイルクローズできることも紹介しました。

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