open() / ファイル.read() / ファイル.write()
| 対応: | Python 2(2000) |
|---|
テキストファイルの読み書きを行う基本的な操作です。『open()』関数でファイルを開き、読み取り・書き込みメソッドを使ってデータを処理します。
構文
# ファイルを開いて読み書き(with 文で自動的に閉じる)
with open(ファイルパス, モード, encoding='utf-8') as f:
内容 = f.read() # 全内容を文字列で読み込む
行 = f.readline() # 1行ずつ読み込む
行リスト = f.readlines() # 全行をリストで読み込む
f.write(テキスト) # テキストを書き込む
f.writelines(行リスト) # 複数行をまとめて書き込む
主なモードと関数一覧
| モード / 関数 | 概要 |
|---|---|
| 'r'(読み取り) | ファイルを読み取りモードで開きます。ファイルが存在しない場合は『FileNotFoundError』が発生します。省略時のデフォルトです。 |
| 'w'(書き込み) | ファイルを書き込みモードで開きます。ファイルが存在する場合は内容を上書きします。存在しない場合は新規作成します。 |
| 'a'(追記) | ファイルを追記モードで開きます。既存の内容の末尾に追加します。 |
| 'x'(排他的作成) | 新規ファイルを作成して書き込みモードで開きます。ファイルが既存の場合は『FileExistsError』が発生します。 |
| f.read() | ファイルの全内容を1つの文字列として返します。 |
| f.readline() | 1行分のテキストを返します。繰り返し呼ぶと順に次の行を返します。 |
| f.readlines() | 全行をリストとして返します。各要素には改行文字が含まれます。 |
| f.write(テキスト) | テキストをファイルに書き込みます。改行は自動では挿入されません。 |
| f.writelines(リスト) | 文字列のリストをまとめてファイルに書き込みます。改行は自動では挿入されません。 |
サンプルコード
file_read_write.py
# ファイルに書き込む
with open('memo.txt', 'w', encoding='utf-8') as f:
f.write('1行目のテキストです。\n')
f.write('2行目のテキストです。\n')
# ファイルの全内容を読み込む
with open('memo.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content) # ファイルの全内容が出力されます。
# 1行ずつ読み込む(大きいファイルに適している)
with open('memo.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.rstrip()) # 末尾の改行を除いて出力します。
# readlines() で全行をリストとして取得
with open('memo.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(f'{len(lines)}行あります。')
print(lines[0].strip()) # 1行目の内容を出力します。
# writelines() で複数行をまとめて書き込む
lines_to_write = ['五条悟\n', '両面宿儺\n', '虎杖悠仁\n']
with open('members.txt', 'w', encoding='utf-8') as f:
f.writelines(lines_to_write)
# 追記モード('a')でファイルの末尾に追加
with open('memo.txt', 'a', encoding='utf-8') as f:
f.write('追記した行です。\n')
# ファイルが存在しない場合のエラー処理
try:
with open('存在しないファイル.txt', 'r', encoding='utf-8') as f:
content = f.read()
except FileNotFoundError:
print('ファイルが見つかりません。')
python3 file_read_write.py 1行目のテキストです。 2行目のテキストです。 1行目のテキストです。 2行目のテキストです。 2行あります。 1行目のテキストです。 ファイルが見つかりません。
よくあるミス
よくあるミス1: with文なしでファイルを開くとクローズ忘れ
『open()』でファイルを開いた場合、明示的に『close()』しないとファイルハンドルが残ります。例外が発生した場合はクローズが実行されないこともあります。『with』文を使うと自動でクローズされます。
NG
# close() を忘れるとファイルハンドルが残る
f = open('members.txt', 'w', encoding='utf-8')
f.write('五条悟\n')
f.write('虎杖悠仁\n')
# f.close() を忘れやすく、例外時にはクローズされない
OK
# with文を使うと自動でクローズ
with open('members.txt', 'w', encoding='utf-8') as f:
f.write('五条悟\n')
f.write('虎杖悠仁\n')
# withブロックを抜けると自動でclose()
よくあるミス2: encoding指定なしで環境依存になる
『open()』でencoding未指定の場合、システムのデフォルトエンコーディング(WindowsではShift_JIS、Unix系ではUTF-8など)が使われます。異なる環境で動作させる場合は文字化けの原因になります。
NG2
# encoding未指定(環境依存)
with open('members.txt', 'w') as f:
f.write('五条悟\n') # 環境によってはShift_JISで書き込まれる
OK2
# encoding='utf-8'を明示する
with open('members.txt', 'w', encoding='utf-8') as f:
f.write('五条悟\n')
f.write('虎杖悠仁\n')
f.write('伏黒恵\n')
よくあるミス3: 追記モード'a'と書き込みモード'w'の混同
モード『w』は既存の内容を全て消去して新規書き込みします。内容を保持して追記したい場合は『a』モードを使います。
初期書き込み後に再度開く場合の違い:
NG3
with open('members.txt', 'w', encoding='utf-8') as f:
f.write('五条悟\n')
# 'w'モードで再度開くと既存内容が消える
with open('members.txt', 'w', encoding='utf-8') as f:
f.write('虎杖悠仁\n') # 五条悟が消えてしまった
OK3
# 'a'モードで追記する
with open('members.txt', 'a', encoding='utf-8') as f:
f.write('伏黒恵\n') # 既存の内容を保持して追記
概要
ファイル操作では『with open(...) as f:』構文が一般的に使われます。『with』文はブロックを抜けると自動的に『f.close()』を呼び出してファイルを閉じるため、例外が発生した場合でもファイルが確実に閉じられます。
日本語などのマルチバイト文字を含むファイルを読み書きする場合は『encoding="utf-8"』を明示的に指定します。Windowsでは省略時のエンコードが環境によって異なるため、文字化けや例外が発生することがあります。
モダンなパス操作ライブラリ『pathlib』を使うと『Path("memo.txt").read_text(encoding="utf-8")』のように簡潔に書けます。詳細は『pathlib.Path()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。