Python

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

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

Pythonでファイル操作するにはopen関数を使います。
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テキストモードで開く(デフォルト)
+更新用で開く

モード引数は省略できます。デフォルトは「r」となっています。

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

open('パス', 'w')

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

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

open('パス', 'rb')

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

STEP2.読み書き

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

ファイルを開くときに指定したモードによって使用できるメソッドが異なります。
書き込み用で開いた場合は読み込みためのメソッドは使えず、読み込み用で開いた場合は書き込むためのメソッドは使えません。

以下のコードは書き込み用で開いたファイルで読み込むためのメソッドを使ってみます。

# 書き込み用で開く
f = open('test.txt', 'w')

# 読み込むメソッドを実行
f.read()
f.close()

実行結果

Traceback (most recent call last):
  File "main.py", line 5, in 
    f.read()
io.UnsupportedOperation: not readable

STEP3. ファイルを閉じる

ファイルを閉じるにはファイルオブジェクトからclose()メソッドを呼ぶだけで閉じられます。

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

しかし、この方法ではファイルを閉じ忘れてしまう可能性があります。

なので、with文を使ってファイルの閉じ忘れを回避しましょう!
with文は以下のように記述します。

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

このように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メソッドは改行までを読み取ります。
引数を指定することで読み出す文字数を指定できます。

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('\n'.join(l))

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

print関数で書き込む

print関数を使うことでもファイルに書き込みできます。file引数を指定することで出力先を変更することができます。
以下のコードでは、open関数で開いたファイルにprint関数を使って書き込んできます。

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’

デフォルトではテキストモードでファイルを開いています。なので、いつもは省略されているだけでwwtは等価です。

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のコード内からファイルを読み書きする方法を解説しました。

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

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

参考7.2. ファイルを読み書きする – 入力と出力 — Python 3.9.1 ドキュメント

最短3か月でエンジニア転職「DMM WEBCAMP COMMIT」
なんと転職成功率98%!
今なら3日以内のカウンセリング枠を予約&参加で「1,000円分のAmazonギフト券」をプレゼント!