Python Path.read_text()とは?ファイルを読み込む方法
PythonのPath.read_text()は、テキストファイルの中身を1行で読み込むpathlibのメソッドです。
open()とwith文を書かずに済むため、設定ファイルや小さなデータの読み込みが簡潔になります。
Path.read_text()の基本的な使い方
from pathlib import Path
text = Path("memo.txt").read_text(encoding="utf-8")
print(text)
実行結果(例):
こんにちは
2行目です
ファイル全体が1つの文字列として返ります。ファイルは自動的に閉じられます。
従来の書き方と比べると、その短さが分かります。
from pathlib import Path
# 従来
with open("memo.txt", encoding="utf-8") as f:
text = f.read()
# pathlib
text = Path("memo.txt").read_text(encoding="utf-8")
encodingは必ず指定する
最も重要な注意点です。
from pathlib import Path
# 推奨されない
text = Path("memo.txt").read_text()
# 推奨
text = Path("memo.txt").read_text(encoding="utf-8")
encodingを省略すると実行環境の既定の文字コードが使われます。これがOSによって違うため、日本語が化けたり例外が出たりします。
| 環境 | 既定のエンコーディング |
|---|---|
| macOS / Linux | UTF-8 |
| Windows(Python 3.14以前) | cp932(Shift_JIS系) |
macOSで動いたコードがWindowsでUnicodeDecodeErrorになる、という事故の定番パターンです。
UnicodeDecodeError: 'cp932' codec can't decode byte 0x82 in position 0
常にencoding="utf-8"を書くと覚えてください。
文字コードが分からないファイル
from pathlib import Path
p = Path("legacy.csv")
for enc in ("utf-8", "cp932", "euc-jp"):
try:
text = p.read_text(encoding=enc)
print(f"{enc} で読めました")
break
except UnicodeDecodeError:
continue
候補を順に試す方法です。読めてしまっても内容が壊れている可能性があるため、結果は必ず目視で確認してください。
存在しないとエラーになる
from pathlib import Path
Path("nope.txt").read_text(encoding="utf-8")
実行結果:
FileNotFoundError: [Errno 2] No such file or directory: 'nope.txt'
フォルダを指定した場合も例外になります。
from pathlib import Path
try:
text = Path("data").read_text(encoding="utf-8")
except FileNotFoundError:
print("ファイルがありません")
except IsADirectoryError:
print("フォルダが指定されています")
事前にexists()で確認するより、例外で受け止めるほうが安全です。確認と読み込みの間にファイルが変化する可能性がないうえ、原因も細かく区別できます。
大きなファイルには向かない
read_text()はファイル全体をメモリに読み込みます。1GBのファイルなら1GB以上のメモリを使います。
大きなファイルは1行ずつ処理してください。
from pathlib import Path
count = 0
with Path("huge.log").open(encoding="utf-8") as f:
for line in f:
if "ERROR" in line:
count += 1
print(count)
Path.open()は組み込みのopen()と同じものを返します。with文と組み合わせれば、メモリを使わずに1行ずつ読めます。
| ファイルサイズの目安 | 使うもの |
|---|---|
| 設定ファイル・小さなデータ | read_text() |
| 数十MB以上のログ・CSV | Path.open()で1行ずつ |
| 表形式のデータ分析 | pandasなど専用ライブラリ |
行のリストとして扱う
from pathlib import Path
lines = Path("memo.txt").read_text(encoding="utf-8").splitlines()
print(lines)
実行結果(例):
['こんにちは', '2行目です']
splitlines()は改行文字を含めずに分割します。split("\n")と違い、末尾の改行で空要素ができません。
text = "a\nb\n"
print(text.splitlines())
print(text.split("\n"))
実行結果:
['a', 'b']
['a', 'b', '']
WindowsとUnixで改行コードが違っても、splitlines()なら同じ結果になります。
JSONやCSVを読む
import json
from pathlib import Path
data = json.loads(Path("config.json").read_text(encoding="utf-8"))
print(data)
実行結果(例):
{'name': 'テックジム', 'version': 2}
json.load(f)ではなくjson.loads(文字列)を使う点に注意してください(末尾のs)。
CSVの場合は、csvモジュールがファイルオブジェクトを求めるためPath.open()を使います。
import csv
from pathlib import Path
with Path("data.csv").open(encoding="utf-8", newline="") as f:
for row in csv.reader(f):
print(row)
CSVではnewline=""の指定が必須です。省略すると、データ内に改行を含む行が正しく読めません。
Path.read_text()のまとめ
read_text()はファイル全体を1つの文字列で返す(自動で閉じる)encoding="utf-8"を必ず指定する(Windowsとの互換性)- 存在しないと
FileNotFoundError、フォルダはIsADirectoryError - 大きなファイルには向かない。1行ずつなら
Path.open() - 行に分けるなら
splitlines() - JSONは
json.loads()、CSVはPath.open(newline="")




