ファイル処理

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

open()関数とファイルオブジェクト

Python でファイルを読み書きするときは、組み込み関数 open() を使ってファイルを開きます。最初の引数にはファイルのパスを渡します。絶対パス (フルパス)、相対パスのどちらでも構いません (path の扱い方についてはこちらの記事を参照してください)。作業フォルダ (プログラムを実行しているフォルダ) に格納されているファイルであれば、ファイル名だけ渡せば開けます (この場合はファイル名が相対パスになっています)。

open() は ファイルオブジェクト を返します。このオブジェクトを介してファイルの読み書きを実行します。デフォルト設定では、ファイルは読み込み専用モード (mode = “r”) で開かれます。

open() で開いたファイルは、最後に必ず close()メソッドで閉じるようにしてください。これを忘れると、複数のファイルを開いたときにプログラムが誤作動することがあります。記事の後半でファイルの閉じ忘れを防ぐ構文についても解説します。

ファイルへの書き込み

 引数 mode に “w” を指定すると、新規ファイルを作成して書き込み専用モードで開きます。ファイルへの書き込みは write()メソッドなどを使って実行します。
 
以下のコードでは “pynote” という名前のテキストファイルを作成して、”Python” と書き込みます。

# PYTHON_FILE_WRITE

# In[1]

# テキストファイルを新規作成して書き込み専用で開く
f = open("pynote.txt", mode="w")

# ファイルに書き込み
f.write("Python")

# ファイルを閉じる
f.close()

mode = “w” ですでに存在しているファイルを開くと、中身を空にしてしまうので注意してください。内容を追加して書き込みたいときは後述する mode = “a” を指定します。

ファイルの読み込み

引数 mode を省略するか、”r” を指定すると、ファイルは読み込み専用モードで開かれます。コード PYTHON_FILE_WRITE で作成した pynote.txt を読み込んで内容を表示させてみます。読み込みにはファイルオブジェクトの read()メソッドを使います。

# PYTHON_FILE_READ

# In[1]

# テキストファイルを読み込み専用で開く
f = open("pynote.txt", mode="r")

# ファイルの内容を表示
print(f.read())

# ファイルを閉じる
f.close()
# Python

ファイルへの追記

open() の最初の引数にすでに存在しているファイル名を渡して mode = “a” を指定すると、write()メソッドで末尾に追記することができます。

# PYTHON_FILE_WRITE_ADD

# In[1]

# テキストファイルを追記モードで開く
f = open("pynote.txt", mode = "a")

# ファイルの末尾に追記
f.write("\nAnaconda")

# ファイルを閉じる
f.close()

# テキストファイルを読み込み専用で開く
f = open("pynote.txt", mode = "r")

# ファイルの内容を表示
print(f.read())

# ファイルを閉じる
f.close()

# Python
# Anaconda

コード PYTHON_FILE_WRITE_ADD を実行すると、”Python” のあとに改行を1つ入れて “Anaconda” というテキストが追加されます。それから、もう一度 pynote.txt ファイルを読み込んでファイルの内容を表示します。

読み書き両方

mode の + オプションは “w”, “r”, “a” と組合わせて、ファイルを読み書き両方できる状態で開きます。次のコードでは、mode = “a+” でファイルを開いて内容を表示した後で、末尾に “\nJupyter Notebook” を書き込みます。そして再度 pnyote.txt を開いて内容を確認しておきます。

# PYTHON_FILE_READ_WRITE

# In[1]

# テキストファイルを読み書き両用モードで開く
f = open("pynote.txt", mode="a+")

# テキストの内容を読み込んで表示
print(f.read())

# ファイルの末尾に追記
f.write("\nJupyter Notebook")

# ファイルを閉じる
f.close()

# テキストファイルを読み込み専用で開く
f = open("pynote.txt", mode="r")

# ファイルの内容を表示
print(f.read())

# ファイルを閉じる
f.close()

# Python
# Anaconda
# Jupyter Notebook

日本語の読み書き

ファイルに書き込む文字列に日本語などの非アスキー文字が含まれていると、環境によっては変換がうまくいかずに文字化けすることがあります。open() の encoding で変換方式 (エンコード) を指定しておいたほうが安全です。現在最も広く使われている変換方式は utf-8 です。

# PYTHON_FILE_JAPANESE

# In[1]

# テキストファイルを新規作成して書き込み専用で開く
f = open("pybook.txt", mode="w", encoding="utf-8")

# ファイルに書き込み
f.write("Python 数値計算入門")

# ファイルを閉じる
f.close()

非アスキー文字を含むファイルを開く場合も、encoding で変換方式を指定しておきます。

# In[2]

# テキストファイルを読み込み専用で開く
f = open("pybook.txt", mode="r", encoding="utf-8")

# ファイルの内容を表示
print(f.read())

# ファイルを閉じる
f.close()

# Python 数値計算入門

ファイルを自動的に閉じる

with構文 を使うとファイルの閉じ忘れを防ぐことができます。with構文は、

with open(ファイルパス, モード) as 変数名:
   コード

の形で記述します。ファイルを閉じる命令文は明示されていませんが、ブロック内のコードが実行された後に自動的にファイルを閉じてくれます。

# PYTHON_FILE_WITH_OPEN

# In[1]

# ファイルへの書き込み
with open("pyfile.txt", "w") as f:
    f.write("Matplotlib")

# ファイルの読み込み
with open("pyfile.txt", "r") as f:
    print(f.read())

# Matplotlib

ファイルオブジェクトのメソッド一覧

ファイルオブジェクトに備わっているメソッドについて解説します。

F.read()

F.read() はファイルの内容をすべて読み込んで文字列として返します。

# PYTHON_FILE_METHOD_READ

# In[1]

# ファイルへの書き込み
with open("pyfile_1.txt", "w", encoding="utf-8") as f:
    f.write("今日もPython、明日もPython")

# ファイルの読み込み
with open("pyfile_1.txt", "r", encoding="utf-8") as f:
    my_str = f.read()
    print(my_str)

# 今日もPython、明日もPython

F.readline()

F.readline() はファイルを一行読み込んで文字列として返します。

# PYTHON_FILE_METHOD_READLINE

# In[1]

# ファイルへの書き込み
with open("pyfile_2.txt", "w", encoding="utf-8") as f:
    # 3行の文章を書き込む
    f.write("NumPyを使うと難しい数値計算ができます。\n\
    SciPyを使うと、もっと難しい数値計算ができます。")

# ファイルの最初の行を読み込む
with open("pyfile_2.txt", "r", encoding="utf-8") as f:
    my_str = f.readline()
    print(my_str)

# NumPyを使うと難しい数値計算ができます。

引数に整数を渡すと、読み込む文字列のバイトサイズを指定できます。アルファベットは 1 文字 1 バイトなので、以下のコードで “NumPy” という 5 文字を取り出すことができます。

# In[2]

# ファイルから一行を読み込む
with open("pyfile_2.txt", "r", encoding="utf-8") as f:
    my_str = f.readline(5)
    print(my_str)

# NumPy

F.readlines()

F.readlines() はファイルをすべて読み込んで行ごとに分割してリストで返します。

# PYTHON_FILE_METHOD_READLINES

# In[1]

# ファイルへの書き込み
with open("pyfile_3.txt", "w", encoding="utf-8") as f:
    # 4行の文章を書き込む(オブジェクト指向の四大要素)
    f.write("カプセル化\n抽象化\nポリモーフィズム\n継承")

# ファイルを読み込む
with open("pyfile_3.txt", "r", encoding="utf-8") as f:
    my_list = f.readlines()
    print(my_list)

# ['カプセル化\n', '抽象化\n', 'ポリモーフィズム\n', '継承']

引数に整数を渡すと、読み込む文字列のバイトサイズの上限を指定できます (サンプルコードは省略)。

F.write()

F.write() はファイルに指定した文字列を書き込みます。

# PYTHON_FILE_METHOD_WRITE

# In[1]

# ファイルへの書き込み
with open("pyfile_4.txt", "w", encoding="utf-8") as f:
    f.write("Pythonは日本語で「ニシキヘビ」です")

# ファイルの読み込み
with open("pyfile_4.txt", "r", encoding="utf-8") as f:
    my_str = f.read()
    print(my_str)

# Pythonは日本語で「ニシキヘビ」です

F.writelines()

F.writelines() は受け取ったイテラブルオブジェクト (リストやタプルなど) の要素を連結してファイルに書き込みます。

# PYTHON_FILE_METHOD_WRITELINES

# In[1]

# 文字列のリストを用意
my_list = ["NumPy, ", "SciPy, ", "SymPy"]

# ファイルへの書き込み
with open("pyfile_5.txt", "w") as f:
    f.writelines(my_list)

# ファイルの読み込み
with open("pyfile_5.txt", "r") as f:
    my_str = f.read()
    print(my_str)

# NumPy, SciPy, SymPy

F.close()

開いた状態のファイルオブジェクトに対して F.colse() を用いると、ファイルを閉じます。

# PYTHON_FILE_METHOD_CLOSE

# In[1]

# ファイルを新規作成して読み込み専用モードで開く
f = open("pyfile_6.txt", mode="w")

# ファイルを閉じる
f.close()

閉じられたファイルは読み書きが一切できない状態です。
コード PYTHON_FILE_METHOD_CLOSE で閉じた pyfile_6.txt を読み込もうとしてもエラーが返ります。

f.read()
# ValueError: I/O operation on closed file.

コメント

  1. HNaito より:

    下記は誤植と思われますので、ご確認ください。
     
    「F.readlines( )」 のプログラムのコメントで、
     # 3行の文章 → 4行の文章
     # ファイルの一行を読み込む → ファイルを読み込む

  2. HNaito より:

    下記は誤植と思われますので、ご確認ください。
    「F.close( )」の説明文で、開こうとしてもエラーが → 読み込もうとしてもエラーが

  3. あとりえこばと より:

    先生: こんにちは、今日は Python の open 関数について説明しましょう。open 関数はファイルを開くために使用されるよ。

    生徒: ああ、ファイルを読み込むためのやつですね。
     
    先生: そうそう、正解だよ。open 関数はファイルを読み込むだけでなく、書き込むこともできるんだ。基本的な使い方は次のようになるよ。open(‘ファイル名’, ‘モード’) という形式で使うんだ。

    生徒: ファイル名って、開きたいファイルの名前を指定するんですね。
     
    先生: その通り!モードはファイルを開く目的や操作方法を指定するものだよ。たとえば、’r’を指定すると読み込みモードで開くことができるし、’w’を指定すると書き込みモードで開くことができるんだ。

    生徒: なるほど、’r’は読み込み、’w’は書き込みなんですね。
     
    先生: そうだよ。他にも ‘a’を指定すると追記モードでファイルを開くことができるんだ。これは既存のファイルに新しい内容を追加する場合に使うよ。

    生徒: 分かりました!それから、ファイルを開いた後はどうやって使うんですか?
     
    先生: ファイルを開いたら、open関数はファイルオブジェクトを返すんだ。このファイルオブジェクトを使って、読み込みや書き込みの操作を行うことができるよ。

    生徒: どんな操作ができるんですか?
     
    先生: たとえば、ファイルオブジェクトのreadメソッドを使うと、ファイルの内容を読み込むことができるんだ。また、書き込みモードで開いた場合はwriteメソッドを使って新しい内容をファイルに書き込むことができるよ。

    生徒: readメソッドやwriteメソッドを使うんですね。なるほど、ファイルの操作ができるようになりました。
     
    先生: よく理解できたね!ファイルの操作は重要なスキルだから、しっかり覚えておくといいよ。
     
    (上のテキストはChatGPTによって作成されました)