この記事では、Pythonのコード内からファイルを読み書きする方法を解説します。Pythonでファイル操作するにはopen関数を使います。ファイルを操作することで外部にデータを保存したり、外部のデータを読み込んだりできます。
それでは、ファイルを読み書きする方法を見ていきましょう!
ファイル操作の基本
ファイルを読み書きするには、open関数で操作したいファイルのファイルオブジェクトを生成します。そして、そのファイルオブジェクトを操作することで、ファイルを読み込んだり、書き込んだりできます。
書式
open関数は以下のように使います。
ファイルオブジェクト名 = open('ファイルのパス', 'モード')
第一引数に操作したいファイルのパスを指定し、第二引数に開いたファイルをどのように扱うかをモードで指定する必要があります。
モード一覧
指定できるモードには、以下のようなものがあります。
文字 | モード |
---|---|
r | 読み込み用で開く |
w | 書き込み用で開く |
x | ファイルが存在しなければ生成し、存在したらエラーとなる |
a | 書き込み用で開く。すでにファイルが存在する場合は末尾に追加する |
b | バイナリモードで開く |
t | テキストモードで開く(デフォルト) |
+ | 更新用で開く |
モード引数は省略できます。デフォルトは「r」となっています。
ファイルを閉じる[closeメソッド]
使い終わったファイルオブジェクトは、closeメソッドで閉じる必要があります。
# ファイルを開く
f = open('ファイルのパス', 'モード')
なんらかの処理
# ファイルを閉じる
f.close()
with文を使うことでブロックを抜けた際にファイルを閉じてくれるようにできます。
with open('ファイルのパス', 'mode') as ファイルオブジェクト名:
# 処理
ファイルを読み込む ‘r’
open関数のモードに‘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’
open関数のモードに‘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関数を使うことでもファイルに書き込みできます。引数を指定することで出力先を変更することができます。
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’
バイナリファイルを扱いたい場合には、バイナリーモードでファイルを開く必要があります。modeにbを付けることで、バイナリーモードとして実行できます。
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のコード内からファイルを読み書きする方法を解説しました。外部のファイルを読み書きすることで、セーブデータや設定ファイルなどを作ることができます。
しかし、そのままファイルに書き込んでしまうと簡単に書き換えられてしまうので暗号化などの一手間を加える必要があります。
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ