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="")

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら