この記事では、Pythonにてファイルの読み込みと書き込みを行う方法について、自身の備忘録も兼ねてまとめています。
ファイルの読み込み
ファイルの読み込み
ファイルの読み込みにはopen()
関数を使用します。開いたファイルを閉じるにはclose()
関数を使用します。
f = open('sample.txt')
# ファイルの内容を表示
print(f)
f.close()
with
ブロックを使うと開いたファイルが自動的に閉じるようになります(閉じ忘れ防止として便利)。
with open('sample.txt') as f:
print(f)
ファイルを読み込む際にエンコーディングを指定する場合は引数としてencoding
を指定します。エンコーディングの指定がない場合は、プラットフォーム依存のエンコーディングが使用されます(locale.getpreferredencoding()
で確認可能)。
encoding
で指定する文字列には大文字・小文字、ハイフン・アンダースコどちらも使用可能です。
Pythonで使用可能なエンコーディングの一覧は以下を参照ください。
codecs — codec レジストリと規定クラス – Python 3.9.4 ドキュメント
f = open('sample.txt', encoding='utf-8')
# デフォルトのエンコーディングを確認
import locale
print(local.getpreferredencoding())
読み込み用としてファイルを開くには、open()
の引数mode='r'
を指定します。なお引数mode
のデフォルト値は'r'
であるため省略が可能です。
f = open('sample.txt', mode='r')
第一引数に存在しないパスをmode='r'
で指定するとエラーFileNotFoundError
が返されます。
f = open('sample_error.txt', mode='r')
print(f)
# FileNotFoundError: [Errno 2] No such file or directory: 'sample_error.txt'
ファイル全体を文字列として読み込み: read()
read()
メソッドを使用すると、開いたファイルを文字列として取得できます。
f = open('sample.txt')
print(f.read())
# line 1
# line 2
# line 3
f.close()
ファイル全体をリストとして読み込み: readlines()
readlines()
メソッドを使用すると、開いたファイルを行ごとに分割したリストとして取得できます。なお、改行コード\n
を含む。
f = open('sample.txt')
print(f.readlines())
# ['line 1\n', 'line 2\n', 'line 3']
f.close()
リストのインデックス指定[]
を使用することで、任意の行の文字列のみを取得できます。
f = open('sample.txt')
print(f.readlines()[0])
# line 2\n
f.close()
改行コード\n
を削除したい場合は、strip()
を使用する。
f = open('sample.txt')
list = [s.strip() for s in f.readlines()]
print(list)
# ['line 1', 'line 2', 'line 3']
f.close()
ファイルを一行ずつ読み込み: for() readline()
ファイルを一行ずつ読み込むにはfor
文を使用します。
f = open('sample.txt')
for line in f:
print(line)
# line 1
#
# line 2
#
# line 3
#
f.close()
readline()
メソッドを使用しても、ファイルを一行ずつ取得できます。
f = open('sample.txt')
print(f.readline())
# line 1
#
f = open('sample.txt')
while True:
print(f.readline())
if not f.readline()
break
# line 1
#
# line 2
#
# line 3
#
f.close()
バイナリファイルの読み込み: mode=’rb’
バイナリファイルの読み込みを行うにはmode
の末尾にb
を指定します。バイナリファイルを読み込む場合にはmode='rb'
を指定します。なお、バイナリファイル読み込みの際にはエンコーディングの指定はできません。
テキストファイルと同様に、バイナリファイルにおいてもread()
、readline()
、readlines()
メソッドは使用できます。
バイナリファイルをprint()
関数で出力するとバイト列が文字列として出力されます。
f = open('sample.bin', 'rb')
print(f.read())
# b'\x01\x02\x03\x04\x05\ ...
f.close()
バイト列をそのまま出力するにはsys.stdout.buffer
を使用します。
import sys
f = open('sample.bin', 'rb')
sys.stdout.buffer.write(f.read())
f.close()
ファイルの書き込み
ファイルの書き込み
ファイルの書き込みにはopen()
関数を使用し、引数にmode="w"
を指定します。ファイルが存在しない場合には新規作成、存在していれば上書きが行われます。
書き込みにはwrite()
メソッドを使用します。開いたファイルを閉じるにはclose()
関数を使用します。
f = open('sample.txt', mode='w')
f.write('カズマさんだぞっ')
f.close()
write()
メソッドの引数に文字列以外を指定した場合には、TypeError
が返されます。str()
での文字列変換が必要になります。
with
ブロックを使うと開いたファイルが自動的に閉じるようになります(閉じ忘れ防止として便利)。
with open('sample.txt', mode='w') as f:
f.write('カズマさんだぞっ')
一つ上の階層が存在しない場合にはFileNotFoundError
が返されます。
f = open('new_dir/sample.txt', mode='w')
f.write('カズマさんだぞっ')
# FileNotFoundError: [Error 3] No such file or directory: 'new_dir/sample.txt'
ファイルを書き込む際にエンコーディングを指定する場合は引数としてencoding
を指定します。エンコーディングの指定がない場合は、プラットフォーム依存のエンコーディングが使用されます(locale.getpreferredencoding()
で確認可能)。
encoding
で指定する文字列には大文字・小文字、ハイフン・アンダースコどちらも使用可能です。
Pythonで使用可能なエンコーディングの一覧は以下を参照ください。
codecs — codec レジストリと規定クラス – Python 3.9.4 ドキュメント
f = open('sample.txt', mode='w', encoding='utf-8')
# デフォルトのエンコーディングを確認
import locale
print(local.getpreferredencoding())
リストを書き込み: writelines()
writelines()
メソッドを使うとリストを書き込むことが出来ます。なおwritelines()
の引数に指定できるリストは文字列を要素とするリストのみです。
list = ['a', 'b', 'c']
f = open('sample.txt', mode='w')
f.writelines(list)
f.close()
writelines()
では改行コードは挿入されず連結されて書き込まれます。改行して書き込みたい場合には、改行コードとjoin()
メソッドを使用してwrite()
メソッドで書き込みます。
list = ['a', 'b', 'c']
f = open('sample.txt', mode='w')
f.write('\n'.join(list))
f.close()
テキストファイルに追記・上書き・挿入: mode=’a’ mode=’r+’
ファイルの末尾に追記で書き込みを行う場合にはmode='a'
を指定します。ファイルが存在しない場合には新規作成が行われます。write()
、writelines()
共に使用できます。
f = open('sample.txt', mode='a')
f.write('カズマだよ')
f.close()
連結していないリストの最終行に追記したい場合には改行コード\n
が必要になります。
list = ['a', 'b', 'c']
f = open('sample.txt', mode='w')
f.write('\nd)
f.close()
ファイルの先頭に書き込みを行う場合にはmode='r+'
を指定します。write()
、writelines()
共に使用できますが、このモードは挿入ではなく上書きという点に注意してください。
f = open('sample.txt', mode='r+')
f.write('カズマだよ')
f.close()
readlines()
メソッドやinsert()
メソッドを使用すると、行の先頭や途中に新たな文字列を挿入できます。
# sample.txt = 唐揚げ\n イカリング\n 病みつきキャベツ\n
with open('sample.txt') as f:
list = f.readlines()
list.insert(0, 'しゅわしゅわ\n')
with open('sample.txt', mode='w') as f:
f.writelines(list)
with open('sample.txt') as f:
print(f.read())
# しゅわしゅわ
# 唐揚げ
# イカリング
# 病みつきキャベツ
ファイルが存在しない場合に書き込み: mode=’x’
引数mode='w'
では、既にファイルが存在していると上書きの処理が自動的に行われてしまいます。このような事態を避けるには、ファイルが存在しない場合にのみ書き込みを行うことが必要になります。
引数にmode='x'
を指定すると、ファイルが存在しない場合は書き込みが行われ、既にファイルが存在する場合はFileExistsError
が返ってくるようになります。
f = open('sample.txt', mode='x')
f.write('カズマだよ')
f.close()
バイナリファイルの書き込み: mode=’wb’
バイナリファイルの書き込みを行うにはmode
の末尾にb
を指定します。バイナリファイルを書き込む場合にはmode='wb'
を指定します。
bin = 'カズマさんだぞ'.encode('utf-8')
f = open('sample.bin', mode='wb')
f.write(bin)
f.close()
テキストファイルと同様に、バイナリファイルにおいてもread()
、readline()
、readlines()
メソッドは使用できます。
コメント