Python入門 第11回:ファイル操作

Python入門 第11回:ファイル操作 Python

はじめに

これまでの記事では、変数やリスト、条件分岐、繰り返し処理、関数、例外処理など、Pythonプログラムを作るための基本的な機能を学んできました。

しかし、プログラムを終了すると、通常は変数に保存していたデータも消えてしまいます。

例えば、次のように変数へ文字列を代入したとします。

message = "こんにちは"
print(message)

このプログラムを実行している間は、messageという変数に「こんにちは」という文字列が保存されています。

ところが、プログラムの実行が終了すると、変数の内容は失われます。次にプログラムを実行したとき、前回のデータをそのまま利用することはできません。

そこで必要になるのが、ファイル操作です。

ファイルへデータを書き込んでおけば、プログラムを終了したあともデータを残せます。また、保存したファイルを後から読み込み、再びプログラムの中で利用することもできます。

Pythonでは、主に次の機能を使用してファイルを操作します。

  • open()でファイルを開く
  • read()でファイル全体を読み込む
  • readline()でファイルを1行ずつ読み込む
  • write()でファイルへ書き込む
  • with構文でファイルを安全に扱う

今回は、Pythonでテキストファイルを読み書きする基本的な方法を解説します。


ファイル操作とは

ファイル操作とは、パソコン内に保存されているファイルをプログラムから読み込んだり、ファイルへ新しいデータを書き込んだりする処理です。

Pythonでは、次のような場面でファイル操作を使用します。

  • プログラムの設定をファイルから読み込む
  • 入力された内容を保存する
  • 実行結果をテキストファイルへ出力する
  • エラーや動作履歴をログとして残す
  • CSVファイルを読み込んでデータを処理する
  • 複数回の実行で同じデータを利用する

簡単なプログラムでは、データを画面へ表示するだけでも問題ありません。しかし、実際のアプリケーションでは、データを保存したり、外部ファイルから情報を読み込んだりする処理が必要になります。

そのため、ファイル操作はPythonを使用するうえで欠かせない機能の一つです。


open()でファイルを開く

Pythonでファイルを操作するときは、最初にopen()関数を使用してファイルを開きます。

基本的な書き方は次のとおりです。

open("ファイル名", "モード")

例えば、sample.txtというファイルを読み込み用として開く場合は、次のように記述します。

file = open("sample.txt", "r")

open()の1つ目の引数には、開きたいファイル名を指定します。

2つ目の引数には、ファイルをどのような目的で開くのかを表す「モード」を指定します。

この例で指定している"r"は、ファイルを読み込み用として開くモードです。

主なファイルモード

ファイルを開くときによく使用するモードは、次のとおりです。

モード意味
r読み込み用としてファイルを開く
w書き込み用としてファイルを開く
aファイルの末尾にデータを追記する
x新しいファイルを作成する
bバイナリモードでファイルを開く
tテキストモードでファイルを開く
+読み込みと書き込みの両方を行う

テキストファイルを扱う場合は、主にrwaの3つを使用します。

rモード

rは「read」の頭文字で、ファイルを読み込み用として開きます。

file = open("sample.txt", "r")

rモードで指定したファイルが存在しない場合は、エラーが発生します。

wモード

wは「write」の頭文字で、ファイルを書き込み用として開きます。

file = open("sample.txt", "w")

指定したファイルが存在しない場合は、新しいファイルが作成されます。

ただし、すでに同じ名前のファイルが存在する場合は、元の内容がすべて削除されます

そのため、既存のファイルをwモードで開くときは注意が必要です。

aモード

aは「append」の頭文字で、既存のファイルの末尾へデータを追加します。

file = open("sample.txt", "a")

wモードとは異なり、元の内容は削除されません。

すでに保存されている内容を残したまま、新しいデータを追加したい場合に使用します。


read()でファイル全体を読み込む

ファイルの内容を読み込むには、read()メソッドを使用します。

最初に、プログラムと同じフォルダへsample.txtという名前のファイルを作成してください。

sample.txtには、次の内容を保存しておきます。

Pythonを勉強しています。
ファイル操作を学習中です。

このファイルをPythonから読み込んでみましょう。

file = open("sample.txt", "r", encoding="utf-8")

text = file.read()

print(text)

file.close()

実行結果は次のようになります。

Pythonを勉強しています。
ファイル操作を学習中です。

file.read()を実行すると、ファイルに保存されている内容が文字列として読み込まれます。

読み込んだ文字列は、textという変数へ代入しています。

text = file.read()

その後、print()関数を使用して内容を表示しています。

print(text)

encodingとは

先ほどのプログラムでは、open()の中に次の指定を追加しています。

encoding="utf-8"

encodingは、ファイルの文字コードを指定するための引数です。

日本語を含むテキストファイルを扱う場合、文字コードが正しく指定されていないと、文字化けが発生したり、エラーになったりすることがあります。

そのため、テキストファイルを扱うときは、基本的に次のように文字コードを指定することをおすすめします。

open("sample.txt", "r", encoding="utf-8")

close()でファイルを閉じる

open()で開いたファイルは、処理が終わったらclose()メソッドで閉じます。

file.close()

ファイルを開いたままにすると、次のような問題が発生する可能性があります。

  • ファイルがほかのプログラムから操作できない
  • 書き込んだ内容が正しく保存されない
  • 使用しているメモリやリソースが解放されない
  • ファイルの破損につながる可能性がある

そのため、open()を使用した場合は、ファイルを閉じる処理も忘れずに記述する必要があります。

file = open("sample.txt", "r", encoding="utf-8")

text = file.read()
print(text)

file.close()

ただし、プログラムが長くなると、close()を書き忘れることがあります。

また、ファイルを開いている途中でエラーが発生すると、close()まで処理が進まず、ファイルが閉じられない可能性もあります。

この問題を解決するために使用されるのが、with構文です。


with構文でファイルを安全に扱う

Pythonでファイルを扱う場合は、open()close()を個別に記述するよりも、with構文を使用する方法が一般的です。

基本的な書き方は次のとおりです。

with open("ファイル名", "モード", encoding="utf-8") as 変数名:
    ファイルを操作する処理

sample.txtの内容を読み込む場合は、次のように記述します。

with open("sample.txt", "r", encoding="utf-8") as f:
    text = f.read()

print(text)

実行結果は次のとおりです。

Pythonを勉強しています。
ファイル操作を学習中です。

as fの部分では、開いたファイルを変数fとして扱えるようにしています。

with open("sample.txt", "r", encoding="utf-8") as f:

with構文の中では、変数fを使用してファイルを操作します。

text = f.read()

with構文の処理が終了すると、ファイルは自動的に閉じられます。

そのため、次のようにclose()を書く必要はありません。

f.close()

ファイルを閉じ忘れる心配がなく、途中でエラーが発生した場合でも適切にファイルを閉じてくれるため、通常はwith構文を使用しましょう。


readline()で1行ずつ読み込む

read()は、ファイルの内容をまとめて読み込みます。

一方、readline()を使用すると、ファイルの内容を1行ずつ読み込めます。

with open("sample.txt", "r", encoding="utf-8") as f:
    line1 = f.readline()
    line2 = f.readline()

print(line1)
print(line2)

sample.txtの内容が次のようになっているとします。

Pythonを勉強しています。
ファイル操作を学習中です。

実行結果は次のようになります。

Pythonを勉強しています。

ファイル操作を学習中です。

空行が入っているように見えるのは、readline()で読み込んだ文字列の末尾に改行文字が含まれているためです。

さらに、print()関数も表示後に改行するため、改行が重なって表示されます。

改行を取り除きたい場合は、strip()メソッドを使用します。

with open("sample.txt", "r", encoding="utf-8") as f:
    line1 = f.readline().strip()
    line2 = f.readline().strip()

print(line1)
print(line2)

実行結果は次のようになります。

Pythonを勉強しています。
ファイル操作を学習中です。

strip()は、文字列の先頭と末尾にある空白や改行を取り除くメソッドです。


繰り返し処理で1行ずつ読み込む

複数行のファイルを1行ずつ処理したい場合は、for文を使用する方法が便利です。

with open("sample.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())

実行結果は次のとおりです。

Pythonを勉強しています。
ファイル操作を学習中です。

ファイルオブジェクトをfor文で繰り返すと、ファイルの先頭から1行ずつ順番に内容を取得できます。

for line in f:

取得した1行分の文字列は、変数lineへ代入されます。

この方法では、ファイル全体を一度にメモリへ読み込む必要がありません。そのため、行数の多いファイルを処理する場合にも適しています。


readlines()で複数行をリストとして読み込む

ファイルの各行をリストとして取得したい場合は、readlines()メソッドを使用します。

with open("sample.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

print(lines)

実行結果は次のようになります。

['Pythonを勉強しています。\n', 'ファイル操作を学習中です。\n']

ファイルの各行が、リストの要素として格納されています。

\nは改行を表す特殊な文字です。

リストの内容を1行ずつ表示する場合は、for文と組み合わせます。

with open("sample.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

for line in lines:
    print(line.strip())

ただし、ファイルの内容が非常に大きい場合、readlines()ではファイル全体をリストとしてメモリへ読み込みます。

大きなファイルを1行ずつ処理する場合は、次の書き方を使用したほうが効率的です。

with open("sample.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())

write()でファイルへ書き込む

ファイルへ文字列を書き込むには、write()メソッドを使用します。

with open("output.txt", "w", encoding="utf-8") as f:
    f.write("Pythonのファイル操作を勉強しています。")

このプログラムを実行すると、プログラムと同じフォルダにoutput.txtというファイルが作成されます。

ファイルの内容は次のようになります。

Pythonのファイル操作を勉強しています。

wモードでは、指定したファイルが存在しない場合、新しいファイルが自動的に作成されます。

open("output.txt", "w", encoding="utf-8")

ただし、すでにoutput.txtが存在する場合は、保存されていた内容が削除され、新しい内容に置き換えられます。

複数行を書き込む

複数行の文章を書き込む場合は、文字列の中に\nを入れます。

with open("output.txt", "w", encoding="utf-8") as f:
    f.write("1行目の文章です。\n")
    f.write("2行目の文章です。\n")
    f.write("3行目の文章です。\n")

ファイルの内容は次のようになります。

1行目の文章です。
2行目の文章です。
3行目の文章です。

write()は、自動的に改行を追加しません。

そのため、行を分けて保存したい場合は、文字列の末尾に\nを記述する必要があります。


aモードでファイルへ追記する

すでに保存されている内容を残したまま、新しい内容を追加したい場合は、aモードを使用します。

まず、log.txtに次の内容が保存されているとします。

プログラムを開始しました。

次のプログラムを実行します。

with open("log.txt", "a", encoding="utf-8") as f:
    f.write("データを読み込みました。\n")

実行後のlog.txtは、次のようになります。

プログラムを開始しました。
データを読み込みました。

aモードでは、ファイルの末尾からデータが追加されます。

with open("log.txt", "a", encoding="utf-8") as f:

プログラムの実行履歴を残すログファイルや、入力内容を順番に保存する場合などに使用できます。


writelines()でリストの内容を書き込む

複数の文字列をまとめてファイルへ書き込みたい場合は、writelines()メソッドを使用できます。

lines = [
    "りんご\n",
    "みかん\n",
    "ぶどう\n"
]

with open("fruits.txt", "w", encoding="utf-8") as f:
    f.writelines(lines)

作成されるfruits.txtの内容は次のとおりです。

りんご
みかん
ぶどう

注意点として、writelines()も自動的に改行を追加しません。

そのため、行ごとに分けて保存したい場合は、各文字列の末尾に\nを付ける必要があります。


ファイルが存在しない場合のエラー

rモードで存在しないファイルを開こうとすると、FileNotFoundErrorが発生します。

with open("data.txt", "r", encoding="utf-8") as f:
    text = f.read()

data.txtが存在しない場合、次のようなエラーが表示されます。

FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

前回学習したtry-except構文を使用すると、ファイルが存在しない場合の処理を記述できます。

try:
    with open("data.txt", "r", encoding="utf-8") as f:
        text = f.read()

    print(text)

except FileNotFoundError:
    print("指定したファイルが見つかりません。")

ファイルが存在しない場合でも、プログラムが突然終了するのではなく、分かりやすいメッセージを表示できます。

ファイル操作では、ファイル名の間違いやファイルの移動などにより、対象のファイルが見つからないことがあります。

そのため、実際のプログラムでは例外処理と組み合わせることも重要です。


ファイルの場所を指定する

ファイル名だけを指定した場合、Pythonは基本的にプログラムを実行しているフォルダからファイルを探します。

with open("sample.txt", "r", encoding="utf-8") as f:
    text = f.read()

別のフォルダにあるファイルを開く場合は、ファイルまでのパスを指定します。

with open("data/sample.txt", "r", encoding="utf-8") as f:
    text = f.read()

この例では、現在のフォルダ内にあるdataフォルダの中から、sample.txtを開いています。

Windowsの絶対パスを指定する場合は、バックスラッシュの扱いに注意が必要です。

with open(r"C:\Users\User\Documents\sample.txt", "r", encoding="utf-8") as f:
    text = f.read()

文字列の先頭にrを付けると、バックスラッシュを特殊文字として処理しない「raw文字列」になります。

また、Windowsでもスラッシュを使用して記述できます。

with open("C:/Users/User/Documents/sample.txt", "r", encoding="utf-8") as f:
    text = f.read()

読み込みと書き込みを組み合わせる

ファイルから内容を読み込み、その内容を加工して別のファイルへ保存することもできます。

まず、names.txtに次の内容を保存します。

tanaka
suzuki
sato

次のプログラムでは、読み込んだ名前を大文字に変換し、output_names.txtへ保存します。

with open("names.txt", "r", encoding="utf-8") as input_file:
    names = input_file.readlines()

with open("output_names.txt", "w", encoding="utf-8") as output_file:
    for name in names:
        output_file.write(name.strip().upper() + "\n")

作成されるoutput_names.txtの内容は次のとおりです。

TANAKA
SUZUKI
SATO

最初のwith構文では、names.txtの内容を読み込んでいます。

with open("names.txt", "r", encoding="utf-8") as input_file:
    names = input_file.readlines()

次のwith構文では、新しいファイルへ加工後の文字列を書き込んでいます。

with open("output_names.txt", "w", encoding="utf-8") as output_file:

このように、ファイル操作と繰り返し処理、文字列操作を組み合わせることで、ファイル内のデータをまとめて変換できます。


実践例:簡単なメモ保存プログラム

最後に、入力した内容をテキストファイルへ保存する簡単なプログラムを作成してみましょう。

memo = input("メモを入力してください:")

with open("memo.txt", "a", encoding="utf-8") as f:
    f.write(memo + "\n")

print("メモを保存しました。")

実行例は次のとおりです。

メモを入力してください:Pythonの記事を作成する
メモを保存しました。

memo.txtには、入力した内容が保存されます。

Pythonの記事を作成する

このプログラムではaモードを使用しているため、再びプログラムを実行しても、以前の内容は削除されません。

例えば、2回目の実行で次の内容を入力します。

メモを入力してください:ファイル操作を復習する
メモを保存しました。

memo.txtの内容は次のようになります。

Pythonの記事を作成する
ファイル操作を復習する

続いて、保存されているメモを表示する処理も追加してみましょう。

memo = input("メモを入力してください:")

with open("memo.txt", "a", encoding="utf-8") as f:
    f.write(memo + "\n")

print("メモを保存しました。")
print()
print("保存されているメモ")

with open("memo.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())

このプログラムでは、次の流れで処理を行っています。

  1. input()でメモを入力する
  2. aモードでメモを追記する
  3. rモードでファイルを開き直す
  4. for文で保存されているメモを表示する

これまでに学習した変数、入力、繰り返し処理、ファイル操作を組み合わせたプログラムです。


ファイル操作でよくある注意点

wモードは元の内容を削除する

wモードで既存のファイルを開くと、それまで保存されていた内容が削除されます。

with open("important.txt", "w", encoding="utf-8") as f:
    f.write("新しい内容")

元の内容を残したまま追加したい場合は、aモードを使用してください。

write()は文字列を書き込む

write()で書き込めるのは文字列です。

次のように整数を直接渡すとエラーになります。

number = 100

with open("number.txt", "w", encoding="utf-8") as f:
    f.write(number)

整数を書き込む場合は、str()を使用して文字列へ変換します。

number = 100

with open("number.txt", "w", encoding="utf-8") as f:
    f.write(str(number))

改行は自動で追加されない

write()writelines()では、自動的に改行されません。

with open("sample.txt", "w", encoding="utf-8") as f:
    f.write("りんご")
    f.write("みかん")

この場合、ファイルの内容は次のようにつながって保存されます。

りんごみかん

行を分ける場合は、\nを追加します。

with open("sample.txt", "w", encoding="utf-8") as f:
    f.write("りんご\n")
    f.write("みかん\n")

基本的にはwith構文を使用する

ファイルを開くときは、次の書き方よりも、

file = open("sample.txt", "r", encoding="utf-8")
text = file.read()
file.close()

次のようにwith構文を使用することをおすすめします。

with open("sample.txt", "r", encoding="utf-8") as f:
    text = f.read()

with構文を使用すれば、ファイルを閉じ忘れる心配がありません。


まとめ

今回は、Pythonのファイル操作について解説しました。

ファイル操作では、まずopen()関数を使用してファイルを開きます。

with open("sample.txt", "r", encoding="utf-8") as f:
    text = f.read()

ファイルを読み込む主な方法は、次のとおりです。

  • read():ファイル全体を読み込む
  • readline():ファイルを1行読み込む
  • readlines():各行をリストとして読み込む
  • for文:ファイルを1行ずつ順番に処理する

ファイルへ書き込む場合は、write()を使用します。

with open("output.txt", "w", encoding="utf-8") as f:
    f.write("書き込む内容")

主なファイルモードは、次の3つです。

  • r:ファイルを読み込む
  • w:ファイルへ新しく書き込む
  • a:既存のファイルへ追記する

特にwモードは、既存のファイル内容を削除するため注意が必要です。

また、ファイルを開くときは、ファイルを自動的に閉じてくれるwith構文を使用するのが基本です。

ファイル操作を利用すると、プログラムの実行結果や入力内容を保存し、次回の実行時にも利用できるようになります。

今後、CSVファイルの処理、設定ファイルの読み込み、ログの保存、データ分析などを行う際にも、今回学習したファイル操作の知識が必要になります。

まずは簡単なテキストファイルを作成し、読み込み、書き込み、追記を実際に試してみましょう。

タイトルとURLをコピーしました