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

Python

この記事では、Pythonのコード内からファイルを読み書きする方法を解説します。Pythonでファイル操作するにはopen関数を使います。ファイルを操作することで外部にデータを保存したり、外部のデータを読み込んだりすることができます。

ファイル操作の基本

ファイルを読み書きするには、open関数で操作したいファイルのファイルオブジェクトを生成します。そして、そのファイルオブジェクトを操作することで、ファイルを読み込んだり、書き込んだりできます。

open関数の使い方

open関数は以下のように使用します。

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

第二引数で、開いたファイルをどのように扱うかをモードで指定する必要があります。

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

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

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

ファイルを閉じる[closeメソッド]

使い終わったファイルオブジェクトは、closeメソッドで閉じる必要があります。

書き方

以下のようにファイルオブジェクトを閉じます。

# ファイルを開く
f = open('ファイルのパス', 'モード')

なんらかの処理

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

with文を使う

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

使い方

以下のように記述します。

with open('ファイルのパス', 'mode') as ファイルオブジェクト名:
    # 処理

with文ブロック内でしかファイルオブジェクトにアクセスできないので注意してください。

ファイルの内容を読み込む:’r’

それでは、同じディレクトリ内に存在するテキストファイルを読み込んでみましょう。パスで指定したファイルが存在していなければ、FileNotFoundErrorが送出されます。

ここでは、以下のテキストファイルを読み込んでみます。

item.txt

ポーション
エーテル
フェニックスの尾

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

readメソッドはまとめて内容を読み出せます。読み込むファイルが大きすぎる場合は危険なので分割して読み出しましょう。

引数を指定することで読み出す文字数を指定できます。

サンプル

with open('item.txt', 'r') as f:
    data = f.read(9)

print(data)

実行結果

ポーション
エーテ

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

readlineメソッドは改行までを読み取ります。
引数を指定することで読み出す文字数を指定できます。

サンプル

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

print(line1)
print(line2)
print(line3)
print(l)

実行結果

ポーション

エーテル

フェニック
スの尾

for文

for文にイテラブルオブジェクトとしてファイルオブジェクトを指定することでファイルの内容を1行ずつ取り出すことができます。

サンプル

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

実行結果

ポーション

エーテル

フェニックスの尾

ファイル内の改行文字も読み込んで出力しているので行間が空いてしまいました。

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

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

サンプル

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

print(lines)

実行結果

['ポーション\n', 'エーテル\n', 'フェニックスの尾']

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

同じディレクトリ内のテキストファイルに書き込んでみます!
パスで指定したファイルが存在しない場合は新しいファイルが生成され、存在する場合は上書きされます。

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

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

サンプル

num = 7532

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

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

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

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

writelinesメソッドを使うことでリストをファイルに書き込むことができます。

書き方

ファイルオブジェクト.writelines(リスト)

サンプル

試しにリストを書き込んでみます。

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

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

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

print関数による書き込み

print関数を使うことでもファイルに書き込みできます。

書き方

以下のようにfile引数を指定することで出力先を変更することができます。

print('出力する内容', file=出力先)

サンプル

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

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

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

既に存在するファイルを生成しようとするとエラーになります。
新たにファイルを生成する場合に上書きの危険性をなくすことができます。

サンプル

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

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

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

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

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

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

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