ファイル入出力

ファイルのオープン・クローズ

f = open("test.txt", "r")
data = f.read()
f.close()
print(data)
ABCDEFG
あいうえお
123456789
open()関数は、指定されるモードに従いファイルを開き、ファイルオブジェクトを戻り値に返します。
ファイルオブジェクト = open(ファイルパス, モード)
ファイルオブジェクト = open(ファイルパス, モード, encoding="文字コード")
ファイルパスは、パスを含めたファイル名を文字列で指定します。指定するファイルが存在しない場合は、モードによって新規作成または例外の何れかになります。
モードには、読み出しは「r」、書き込みは「w」のようなファイルの開き方を文字で指示します。モードを省略した場合は読み出しの「r」が適用されます。
encoding引数に文字コードを指定できます。文字コードには、「utf-8」「shift_jis」「euc_jp」などが指定できます。省略した場合は、動作しているOSに従って自動的に選択されます。
戻り値で返るファイルオブジェクトのメソッドにより、開いたファイルに対する操作を行います。
ファイルオブジェクト.メソッド(引数)
close()メソッドでファイルを閉じてアクセスを終了します。
ファイルオブジェクト.close()
オープンモード
モードには、開くファイルへの操作ごとに以下を指定します。
モード 既存ファイルなし時の
open()の結果
既存ファイルあり時の
open()の結果
読み出し
可・不可
書き込み
可・不可
r エラー 成功 可能 不可
r+ エラー 成功 可能 可能(上書き)
w 成功(新規作成) 成功 不可 可能
w+ 成功(新規作成) 成功(内容破棄) 可能 可能
a 成功(新規作成) 成功 不可 可能(末尾に追記)
a+ 成功(新規作成) 成功 可能 可能(末尾に追記)
x 成功(新規作成) エラー 不可 可能
x+ 成功(新規作成) エラー 可能 可能
「r」「w」は、開いたファイルの先頭からの読み出し・書き込みになります。「a」は、既存ファイルを開いた場合にファイルの末尾からの追記になります。
モードに「b」を追加して「r+b」「wb」のように指定するとバイナリモードで開きます。デフォルトはテキストモードとなります。バイナリモードではファイルのデータをバイト列としてバイト単位で読み書きします。

テキストファイルへ文字列を書き込む

f = open("test.txt", "w")
data = "ABCDEF\nあいうえお\n123456789"
f.write(data)
f.close()
test.txt
ABCDEF
あいうえお
123456789
write()メソッドは、ファイルへ文字列を書き込みます。引数に与える文字列がファイルに書き込まれます。
ファイルオブジェクト.write(文字列)
複数文字列の書き込み
f = open("test.txt", "w")
lines = ["GHIJKLM\n", "かきくけこ\n", "09876543\n"] 
f.writelines(lines)
f.close()
test.txt
GHIJKLM
かきくけこ
09876543
writelines()メソッドは、文字列のリストの要素を順番にファイルに書き込みます。
各文字列は自動的に改行されません。
ファイルオブジェクト.writelines(文字列のリスト)

テキストファイルを読み込む

test.txt
GHIJKLM
かきくけこ
09876543
f = open("test.txt", "r")
txt = f.read(10)
f.close()
print(txt)
GHIJKLM
かき
read()メソッドは、テキストファイルから文字列を読み出します。
引数には読み込む文字数を指定できます。改行も1文字として読み出します。文字数を省略した場合はファイル全体を読み出します。
文字列 = ファイルオブジェクト.read(文字数)
行の読み出し
f = open("test.txt", "r")
ln = f.readline()
while ln:
    print(ln, end="")
    ln = f.readline()
f.close()
GHIJKLM
かきくけこ
09876543
readline()メソッドは、テキストファイルを行単位に読み出します。
readline()を繰り返し呼び出すと、次の行を読み出します。戻り値は、末尾に改行が含まれた状態の行の文字列が返ります。テキストファイルの終端に達したときは、空文字「""」が返ります。
文字列 = ファイルオブジェクト.readline()
複数行の読み出し
f = open("test.txt", "r")
lines = f.readlines()
f.close()
for ln in lines:
    print(ln)
GHIJKLM
かきくけこ
09876543
readlines()メソッドは、テキストファイルを読み出し、行単位でリストに格納します。
リストの要素の文字列の末尾には改行文字が含まれます。
文字列のリスト = ファイルオブジェクト.readlines()

バイナリファイルを読み書きする

f = open("test.bin", "wb")
f.write(b"\x01\x02\x03\x04\x05")
f.close()

f = open("test.bin", "rb")
bin = f.read()
print(bin)
f.close()
b'\x01\x02\x03\x04\x05'
open()に指定するモードに"b"を付けた場合、バイナリファイルへの操作になります。バイナリファイルへの書き込みと読み出しは、write()とread()メソッドを使います。バイナリモードでは、書き込むデータにバイト列を与え、読み出す長さの単位はバイト数になります。
ファイルオブジェクト.write(バイト列)
バイト列 = ファイルオブジェクト.read(バイト数)

バッファの強制書き込み

f.write("ABCDEFG")
f.flush()
f.close()
flush()メソッドは、物理ディスクへのバッファの書き込みを強制します。
OSがタイミング調整している物理ファイルへの書き出しを、即時に行います。
ファイルオブジェクト.flush()

ファイルのオフセット取得とオフセット移動

test.bin
b'\x01\x02\x03\x04\x05'
f = open("test.bin", "rb")
f.seek(3)
bin = f.read(2)
print(f.tell(), bin)
f.seek(2, 0)
bin = f.read(2)
print(f.tell(), bin)
f.close()
5 b'\x04\x05'
4 b'\x03\x04'
tell()メソッドは、ファイル中の次に読み出す位置(ファイルの先頭を0とするオフセット)を返します。seek()メソッドは、次に読み出す位置、または書き込む位置を移動して、ファイルの中をランダムにアクセスします。
オフセット = ファイルオブジェクト.tell()
ファイルオブジェクト.seek(移動オフセット, 基準位置)
基準位置 = 0:ファイル先頭から、1:現在位置から、2:ファイル終端から

with構文

with open("test.txt", "w+") as f:
    f.write("ABCDEF\n")
    f.write("あいうえお\n123456789")
    f.seek(2, 0)
    print(f.read(3))
CDE
with構文により、ファイルオブジェクトを閉じるclose()メソッドの呼び出しを省略できます。
with構文ブロックの中で、ファイルオブジェクトのメソッドによるファイル操作を行います。ブロックから出るときに、自動的にファイルは閉じられます。ブロックの中で、ファイルアクセス関係のエラーで例外が発生したときも自動的に閉じられます。open()とclose()で発生し得る例外を完璧にtry~exceptで実装するとたいへん複雑になるので、with構文の利用は有意です。
with open(ファイルパス, モード) as ファイルオブジェクト:
    ファイルの読み書きなどの処理
    ...
with構文は「コンテキストマネージャー」と呼ばれるしくみによって実装しており、ファイル以外にも対応するクラスがあります。