python

【python】ファイル読み書き

ファイルを書き込んだり読み込んだりする手順

様々な言語においてファイルを読み書きするには共通の手順があります。

①ファイルを開く

②ファイルを読み込み込んだり、書き込んだり処理をする

③ファイルを閉じる

ファイルを開く

open(“ファイル名”, “w”) で書き込み可能なファイルを新規作成します。 既にファイルがある場合は削除され新しいファイルができます。 w を a にすることで新規作成ではなくファイルの後ろに追記するようにできます。

f = open("numbers.txt", "w") #新規作成
f = open("numbers.txt", "a") #追記作成
f = open("numbers.txt", "w", encording="UTF-8") #文字コード指定

ファイルを読み込む

open(“ファイル名”, “r”) でファイルを読み込みます。

readline()

ファイルの中身の読み込みには一行毎に読み込む メソッド

print("# readline")
with open("numbers.txt", "r") as f:
    # ファイルの終わりまでreadlineを繰り返す
    while True:
        line = f.readline()
        if line == "": # 空文字の場合はファイルの最後まで読み込んでいる
            break
        print(line, end="")
0,0
1,1
2,4
3,9
4,16
5,25
6,36
7,49
8,64
9,81
readlines()

全行読み込みリストで返してくれるメソッド 下記の line または readlines() の結果の要素の例で分かる通り、一行毎に読み込んだ場合には最後に改行文字が含まれていることがわかると思います。

print("# readlines")
with open("numbers.txt", "r") as f:
    # 全行読み込み
    lines = f.readlines()
print("f.readlines() =", lines)
for line in lines:
    print(line, end="")
# readlines
f.readlines() = ['0,0\n', '1,1\n', '2,4\n', '3,9\n', '4,16\n', '5,25\n', '6,36\n', '7,49\n', '8,64\n', '9,81\n']
0,0
1,1
2,4
3,9
4,16
5,25
6,36
7,49
8,64
9,81

for文を使って文を読み込む Pythonでは for 文を使って一行ごとに取り出すことが多いです

with open("numbers.txt", "r") as f:
for line in f:
    line = line.rstrip()
    print(line)
#0,0
#1,1
#2,4
#3,9
#4,16
#5,25
#6,36
#7,49
#8,64
#9,81

ファイルに書き込む

write()

書き込みたい文字列 write_str をファイルに書き込むメソッドです。 Pythonでは改行などは自動では入らないため明示的に改行を入れてあげる必要があります。

numbers = [i for i in range(10)]
for number in numbers:
f.write(f"{number},{number**2}\n")
writelines()

文字列を要素に含むシーケンスを引数ひ与えファイルに書き込むメソッドです

ファイルを閉じる

close()

ファイルへの書き込みが全て終わった後には close() メソッドを呼び出しファイルを閉じましょう。 ファイルが閉じているかについては closed で確認することができます。

print(f.closed)#False
f.close()
print(f.closed)#True

close済みのファイルへのアクセス close済みのファイルに対して書き込もうとしてもエラーが発生し書き込むことができません。 ファイルへの操作が不要になった場合はcloseをしていきましょう。

f.write("err")
ValueErrorTraceback (most recent call last)
<ipython-input-5-4af922d3fca6> in <module>()
----> 1 f.write("err")

ValueError: I/O operation on closed file.
closeを自動化する

自動でcloseしてくれるようにPythonでは with 文を使ったファイルのopenが推奨されている
with文の公式ドキュメント

#withを使ったopen()
with open("numbers.txt", "w") as f:
for number in numbers:
    f.write(f"{number},{number**2}\n")

#withを使わないopen()=上のコードとほぼ等価
f = open("numbers.txt", "w")
for number in numbers:
        f.write(f"{number},{number**2}\n")
f.close()
with open("test.txt", "w") as f:
    # withの内ではファイルが開いている
    print("withの内", f.closed)#withの内 False

# withの外側ファイルが閉じている
print("withの外", f.closed)#withの外 True

ファイルへの読み込み 下のコードを実行すると以下のファイルが出来上がります

f = open("numbers.txt", "w")
numbers = [i for i in range(10)]
for number in numbers:
    f.write(f"{number},{number**2}\n")
0,0
1,1
2,4
3,9
4,16
5,25
6,36
7,49
8,64
9,81

もっと知りたい方へ

ファイルの入出力