Python

【Python】ファイルを読み書きする方法【open関数】

この記事では、Pythonのコード内からファイルを読み書きする方法を解説します。

Pythonでファイル操作するには、open関数を使って生成したファイルオブジェクトを通して、ファイルにデータを書き込んだり、ファイルのデータを読み込んだりします。

それでは、ファイルを読み書きする方法を見ていきましょう!

ファイル操作の基本

ファイルの読み書きは、以下のような手順で行われます。

  • STEP1
    open関数でファイルを開く
    open関数を使ってファイルを開きます。戻り値にはファイルオブジェクトを返します。引数には、操作したいファイルのパスとモードを指定します。以下のコードは同じディレクトリ内にtest.txtというファイルを書き込み用として開きます。

    f = open('test.txt', 'w')
  • STEP2
    読み書き

    先ほど書き込み用としてファイルを開いたので、生成したファイルオブジェクトのメソッドを使って、適当に文字を書き込んでみます。

    f.write('適当な文字')
  • STEP3
    ファイルを閉じる

    開いたファイルは必ず閉じる必要があります。ファイルを閉じるには、ファイルオブジェクトのclose()メソッドを呼び出します。

    f.close()

これがファイルを読み書きする基本となります。もう少しだけ詳しく見ていきましょう❗️

STEP1.ファイルを開く

ファイルを開くには、open関数を使います。open関数は、引数に「パス」と「モード」を受け取り、モードに対応したファイルオブジェクトを返します。

ファイルオブジェクト名 = open('パス', 'モード')

オプションでエンコーディングを指定することもできます。

ファイルオブジェクト名 = open('パス', 'モード', 'エンコーディング')

モード一覧

指定できるモードには、以下のようなものがあります。

文字 モード
r 読み込み用で開く(デフォルト)
w 書き込み用で開く
x ファイルが存在しなければ生成し、存在したらエラーとなる
a 書き込み用で開く。すでにファイルが存在する場合は末尾に追加する
b バイナリモードで開く
t テキストモードで開く(デフォルト)
+ 更新用で開く

以下のようにモードを省略すると、「読み込み用」+「テキストモード」としてファイルを開きます。

f = open('パス')

「書き込み用」 + 「テキストモード」でファイルを開くには、

f = open('パス', 'w')

# テキストモードを明示的に指定することもできるが必要はない
f = open('パス', 'wt')

「読み込み用」 + 「バイナリモード」でファイルを開くには、

f = open('パス', 'rb')

という感じで記述します。

STEP2.読み書き

生成したファイルオブジェクトからファイルを操作することができます。

指定したモードに対応したファイルオブジェクトが生成されるので、モードによって使用できるメソッドが異なります。書き込み用で開いた場合は、読み込むためのメソッドは使えず、読み込み用で開いた場合は、書き込むためのメソッドは使えません。

モード別のファイルオブジェクトの使い方は後述します。

STEP3. ファイルを閉じる

ファイルを閉じるには、close()メソッドを呼び出します。

ファイルオブジェクト.close()

この方法ではファイルを閉じ忘れてしまう可能性があるので、基本的にはwith文を使います。with文は、以下のように記述します。

with open('パス', 'モード') as ファイルオブジェクト名:
    # なんらかの処理

with文を使うことで、ブロックを抜けた際に勝手にファイルを閉じてくれます。

【Python】自作クラスをwith文で使う方法【コンテキストマネージャ】この記事では、Pythonのユーザー定義クラスをwith文で使えるようにする方法を解説します。with文を使うことで、前処理と後処理を安...

ファイルを読み込む ‘r’

open関数のモードに'r'を指定するか、省略することで、ファイルを読み込むためのファイルオブジェクトを生成できます。

指定したパスのファイルが無ければ、FileNotFoundErrorが送出されます。

まとめて取得:readメソッド

readメソッドを使うことで、内容をまとめてを読み取ることができます。読み込むファイルが大きすぎる場合は危険なので、分割して読み出しましょう。引数を指定することで、読み出す文字数を指定することができます。

with open('test.txt', 'r') as f:
    data = f.read(10)

print(data)

実行結果

one
two
th

1行ずつ取得:readlineメソッド

readlineメソッドを使うことで、1行ずつ(改行まで)読み取ることができます。引数を指定することで、読み出す文字数を指定できます。

with open('test.txt', 'r') as f:
    line1 = f.readline()
    line2 = f.readline()
    line3 = f.readline(5)
    l = f.readline()

print(f'line1: {line1}')
print(f'line2: {line2}')
print(f'line3: {line3}')
print(f'l: {l}')

実行結果

line1: one

line2: two

line3: three
l: 

for文を使うことで、ファイルの内容を1行ずつ取得することができます。

with open('test.txt', 'r') as f:
    # ファイルの内容を1行ずつ取り出す
    for line in f:
        print(line)

実行結果

one

two

three

ファイル内の改行文字も読み込み、print関数で出力しているので、行間が余分に空いてしまっています。

リストとして取得:readlinesメソッド

readlinesメソッドを使うことで、全ての行をリスト形式で読み出せます。ちなみに、ファイルオブジェクトをリストに変換することでも同様の処理が可能です。

with open('test.txt', 'r') as f:
    lines = f.readlines()
    # lines = list(f)でも同じ

print(lines)

実行結果

['one\n', 'two\n', 'three']

ファイルに書き込む ‘w’

open関数のモードに'w'を指定することで、ファイルを書き込むためのファイルオブジェクトを生成することができます。

指定したパスのファイルが存在しない場合、新しくファイルが生成され、存在する場合は上書きされます。

文字列を書き込む:writeメソッド

writeメソッドを使うことで、引数に渡された文字列を書き込むことができます。文字列型ではないデータを書き込みたい場合は、文字列型に変換する必要があります。

num = 7532

# 文字列に変換
s = str(num)

with open('test.txt', 'w') as f:
    f.write(s)

以下のファイルが生成されました。

リストの書き込み:writelinesメソッド

writelinesメソッドを使うことで、引数に指定したリストをファイルに書き込むことができます。

l = ['いち', 'に', 'さん']

with open('test.txt', mode='w') as f:
    f.writelines(l)

以下のようなファイルが生成されました。

print関数で書き込む

print関数を使うことでもファイルに書き込むことができます。print関数のfile引数に、任意のファイルオブジェクトを指定することで、出力先を変更することができます。

with open('test.txt', 'w') as f:
    print('print関数による書き込み', file=f)

以下のようにファイルに書き込むことができました。

ファイルの排他的な生成 ‘x’

open関数のモードに'x'を指定することで、パスで指定したファイルを生成することができます。すでに同じパスのファイルが存在する場合はエラーとなります。

このモードでは、新たにファイルを生成する場合に上書きの危険性を回避することができます。ちなみに、生成されたファイルオブジェクトは書き込み用です。

with open('x.txt', 'x') as f:
    f.write('排他的な生成')

以下のようにファイルが生成されました。

もう一度同じコードを実行すると、FileExistsErrorが送出されます。

書き込みまたは追記 ‘a’

open関数のモードに'a'を指定することで、書き込み用としてファイルを開くことができます。すでに同じパスのファイルが存在していれば、そのファイルの末尾に追記することができます。

試しに、同じファイルを何度も呼び出し、書き込んでみます。

strings = []

# 3回文字列を入力してもらう
for i in range(3):
    strings.append(input('文字を入力してください: '))

for string in strings:
    # 同じファイルに書き込み
    with open('strings.txt', 'a') as f:
        f.write(string + '\n')

実行

文字を入力してください: one
文字を入力してください: two
文字を入力してください: three

以下のようなファイルが生成されました。

バイナリーモードで開く ‘b’

バイナリファイルを扱いたい場合には、バイナリーモードでファイルを開く必要があります。modebを付けることで、バイナリーモードとして実行することができます。

s = 'わ'

# 'わ'をbytesに変換
b = s.encode()

# 書き込み(rb = 書き込み + バイナリーモード)
with open('binary.bin', 'wb') as f:
    f.write(b)


# 読み込み(rb = 読み込み + バイナリーモード)
with open('binary.bin', 'rb') as f:
    b = f.read()

print(b)

# bytesからstrに変換
print(b.decode())

実行結果

b'\xe3\x82\x8f'
わ

ディレクトリ内に、以下のようなバイナリーファイルが生成できました。

テキストモードで開く ‘t’

バイナリモードを指定していなければ、デフォルトでテキストモードでファイルを開いています。なので、いつもは省略されているだけで'w''wt'は等価です。

s = '書き込み'

with open('test.txt', 'wt') as f:
    f.write(s)


with open('test.txt', 'rt') as f:
    d = f.read()

print(d)

実行結果

書き込み

更新用で開く ‘+’

+は、'r'、または'rb'と組み合わせることで、指定した場所の文字のみを書き換えることができます。

例えば、以下のようなテキストファイルがあったとします。

test.txt

abcd
123
あいう

このファイルを'r+'で書き換えてみます。

s = 'zyx'

with open('test.txt', 'r+') as f:
    f.write(s)

with open('test.txt', 'r') as f:
    d = f.read()

print(d)

実行結果

zyxd
123
あいう

abcの部分のみを書き換えることができました。

位置の移動[seekメソッド]

ファイルオブジェクトのseekメソッドを使うことで、書き込む位置を移動することができます。ただし、文字単位の移動なので、扱いが難しいです。

s = 'zyx'

with open('test.txt', 'r+') as f:
    f.seek(5)
    f.write(s)

with open('test.txt', 'r') as f:
    d = f.read()

print(d)

実行結果

zyxd
zyx
あいう

seekメソッドで5文字目に移動したので、5文字目から書き換えられました。

まとめ

この記事では、Pythonでファイルを読み書きする方法を解説しました。

ファイルを読み書きすることでセーブデータや設定ファイルなどを作ることができます。しかし、そのままファイルに書き込んでしまうと簡単に書き換えられてしまうので、暗号化などの一手間を加える必要があります。

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』