PYTHON 3.15

Python 3.15 で何が変わる?UTF-8 デフォルト化で確認する5点

Python 3.15 では、encoding を書かずに開いたファイルが UTF-8 で読み書きされるようになります。日本語 Windows で Shift_JIS(cp932)の CSV を読んでいるコードが止まるかどうかを、上げる前に確認する手順です。

🎯 対象: Windows で CSV・テキストを読み書きしている初心者〜初級者 ⏱️ 読了: 約12分 🐍 検証: Python 3.15.0 本体(Windows 用 embeddable 版)で実測

結論:Python 3.15 では UTF-8 モードが既定(デフォルト)になり、encoding を書かずに開いたファイルは cp932 ではなく UTF-8 で読み書きされます。日本語 Windows で Shift_JIS(cp932)の CSV を encoding なしで読んでいるコードは、多くの場合 UnicodeDecodeError で止まります。直し方は encoding="cp932" を書き足すことです。

📌
2026年10月12日時点の情報です

Python 3.15.0 は2026年10月9日に正式リリースされました(リリースページ・PEP 790)。

1. 結論:encoding 省略が UTF-8 に。確認は5点

初心者に関係する主な変更は、UTF-8 既定化・エラーメッセージの改善・インストーラーの変化の3つです。コードの修正が必要になりやすいのは UTF-8 既定化で、確認するのは次の5点です。

#確認すること3.15 で起きること対処
①日本語の cp932 ファイルを encoding なしの open()/Path.read_text() で読んでいないか多くの場合 UnicodeDecodeError(3章)encoding="cp932"
②encoding なしで書き出したファイルを Excel などで開いていないか中身が BOM なし UTF-8 になる"utf-8-sig" か "cp932"
③Windows のコマンド出力を subprocess の text=True で受けていないか多くの場合、読み取り中に UnicodeDecodeError が出て stdout が None に(6章)encoding="cp932"
④上げる前に -X warn_default_encoding で書き忘れを洗い出したか3.14 のまま該当行が分かる(4章)出た行に encoding を書く
⑤今の版を残したまま py -3.15 で試したか旧版と結果を比べられる(8章)py で共存させる

①〜③は encoding を省略したときだけの話です。中身が半角の英数字・記号(ASCII)だけのファイルも、cp932 と UTF-8 でバイト列が同じなので影響は出ません。

2. UTF-8 既定化で何が変わるのか

根拠は PEP 686 です。Python 3.7 からある「UTF-8 モード」が、3.15 では既定で有効になります。PEP 686 は、多くの Unix 系 OS はもともと UTF-8 のロケールなので主に影響を受けるのは Windows のユーザーだと書いています。3.14 までの日本語 Windows では、encoding 省略の open() は cp932 で読み書きしていました。

3.15 で UTF-8 になるもの変わらない・もとから UTF-8 のもの
encoding 省略の open()・Path.read_text()/write_text() などencoding を明示した呼び出し
csv モジュールで読み書きするファイル(open() で開くため)pandas の read_csv()・to_csv()(もとから UTF-8)
subprocess の text=True で受ける出力コンソール画面の入出力(3.6 から UTF-8)
locale.getpreferredencoding()(3.15.0 で 'utf-8' を返した)ファイル名の扱い(3.6 から UTF-8)/locale.getencoding()('cp932' のまま)

読めないバイトの扱い(エラーハンドラ)は strict のままです。文字化けで通さず、例外で止まります。

3. 再現:cp932 の CSV を UTF-8 モードで読む

📌
検証条件:Python 3.15.0 本体で実測

2026年10月12日、Windows 11(コードページ 932)で公式の Windows embeddable package(インストール不要の zip 版 python-3.15.0-embed-amd64.zip)を展開して実行しました。インストーラー版・install manager 版、py ランチャー、pip では試していません。既定の確認は python.exe -I(環境変数を無視)です。3.14 の結果は2026年9月28日に 3.14.7 で得ました。

テスト用の cp932 の CSV を作り、encoding なしで読みます。

# make_sjis.py:テスト用 CSV を cp932 で作る
with open("sjis.csv", "w", encoding="cp932", newline="") as f:
    f.write("日付,銘柄,金額\n2026/09/01,トヨタ自動車,12000\n")
# read_min.py
import csv

with open("sjis.csv", newline="") as f:
    for row in csv.reader(f):
        print(row)

PowerShell かコマンドプロンプトで実行します(Git Bash などの UTF-8 端末では表示が化けて見えることがあります)。

py -3.14 read_min.py          # OFF(3.14 までの既定)
py -3.14 -X utf8 read_min.py  # ON(3.15 の既定と同じ状態)

OFF では ['日付', '銘柄', '金額'] と ['2026/09/01', 'トヨタ自動車', '12000'] が表示されました。3.15.0 では何も付けずに実行すると止まりました(パス省略。ON の行も同じ)。

Traceback (most recent call last):
  File "...\read_min.py", line 5, in <module>
    for row in csv.reader(f):
               ~~~~~~~~~~^^^
  File "<frozen codecs>", line 325, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte

0x93 は「日」の cp932 での先頭バイトです。例外が出るのは open() の行ではなく、中身を読む for の行です。ほかの原因はPythonエラー辞典の UnicodeDecodeErrorにあります。エラー文から元の文字コードを当てる手順はUnicodeDecodeError の直し方へ。

条件sys.flags.utf8_modecp932 の CSV(省略)UTF-8 の CSV(省略)encoding="cp932"
OFF(3.14 までの既定・3.15.0 で -X utf8=0)0読めるUnicodeDecodeError読める
ON(3.15.0 の既定)1UnicodeDecodeError読める読める

逆に、BOM なし UTF-8 の CSV を省略で読んで失敗していたコードは、ON では読めました。encoding を書いておけば、どちらの向きでも版による差は出ません。

4. 影響する箇所を洗い出す

encoding の省略箇所は、3.10 から使える -X warn_default_encoding で探せます。3.14 のまま実行できるので、上げる前に点検できます。What's New 3.15 が影響箇所の特定に勧めるのも、この警告です。

py -3.14 -X warn_default_encoding read_min.py
...\read_min.py:4: EncodingWarning: 'encoding' argument not specified
  with open("sjis.csv", newline="") as f:

警告は open() の行(4行目)を指し、処理は止まりません。ふだんの操作をひととおり実行して、出た行に encoding を書いていきます。環境変数 PYTHONWARNDEFAULTENCODING=1 でも同じです。3.15.0 でも同じ行に警告が出ました。

5. 直し方:encoding を1つ書き足す

状況書き方
cp932 のファイルを読む・書くencoding="cp932"
新しく作るファイルを UTF-8 に統一するencoding="utf-8"
Excel でダブルクリックして開く CSV を出すencoding="utf-8-sig"(BOM 付き)
3.14 までと同じ「OS の文字コード」を明示するencoding="locale"
すぐ直せないので起動時だけ元に戻す(一時しのぎ)PYTHONUTF8=0/-X utf8=0
import csv

with open("sjis.csv", newline="", encoding="cp932") as f:          # 読む
    rows = list(csv.reader(f))

with open("out.csv", "w", newline="", encoding="utf-8-sig") as f:  # Excel 向けに書く
    csv.writer(f).writerows(rows)

3.15.0 で動き、out.csv の先頭には BOM(EF BB BF)が付きました。encoding="locale"(3.10 から使える指定)でも読めました。日本語 Windows の locale.getencoding() は 3.15.0 でも ON/OFF とも 'cp932' を返したためです。ただし Mac や Linux では UTF-8 になるので、相手が cp932 と決まっているなら "cp932" と書く方が確実です。文字コードを順に試して読み、utf-8-sig で保存するアプリの例としてCSVデータビューア・エディタがあります。

書き出しは BOM なし UTF-8 に変わる

encoding 省略で「日本語」を書くと、OFF は cp932 の b'\x93\xfa\x96{\x8c\xea'、ON は UTF-8 の b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e' になりました(3.15.0)。Microsoft のサポート記事によると、UTF-8 の CSV は BOM 付きなら Excel で普通に開け、BOM なしは「データの取得」→「ファイルから」→「テキストまたは CSV から」で開きます。BOM なしを Excel で直接開いたときの表示は、当サイトでは確認していません。

なお Python の codecs のドキュメントは、UTF-8 での BOM は一般に避けるべきとしています。付けるのは Excel で開くファイルに限るのが無難です。

errors= は最後の手段

errors= は読めないバイトの扱いを変える引数で、既定は "strict"(例外)、ほかに "replace"(「�」に置換)や "ignore"(黙って捨てる)などがあります。cp932 のファイルを encoding="utf-8", errors="replace" で読むと、例外は消えますが1行目は ���t,����,���z でした。エラーが消えても、データは読めていません。先に encoding を正しく指定してください。

一時的に元へ戻す:PYTHONUTF8=0 と -X utf8=0

py -3.15 -X utf8=0 app.py

# PowerShell:そのウィンドウの間だけ無効にする
$env:PYTHONUTF8 = "0"
py -3.15 app.py

公式ドキュメントによると、UTF-8 モードは起動時にしか無効にできません。別の PC で動かせばこの設定はないので、恒久対応は encoding の明示です。3.15.0 ではどちらの指定でも3章の CSV が読めました。

pandas は 3.15 でも変わらない

pd.read_csv() の encoding は、pandas の公式ドキュメント上もとから 'utf-8' が既定です。pandas 3.0.3(Python 3.12.10)で cp932 の CSV を読むと、UTF-8 モードの ON/OFF どちらでも UnicodeDecodeError になり、encoding="cp932" で読めました。3.15 で新たに壊れるわけではありません。例外は open() で開いたファイルを read_csv() に渡すコードで、こちらは open() 側の既定が変わります。実例は証券会社のCSVをpandasで読み込むにあります。

6. subprocess の text=True も要注意

text=True で受ける出力も、3.15 では UTF-8 で文字列にされます。cp932 を出力する Windows のコマンドを 3.15.0 で受けました。

import subprocess

r = subprocess.run(["cmd", "/c", "echo", "日本語"], capture_output=True, text=True)
print(r.stdout.strip())

-X utf8=0 では「日本語」と表示されました。既定のままでは読み取り中に UnicodeDecodeError が出て r.stdout が None になり、最後は AttributeError: 'NoneType' object has no attribute 'strip' で止まりました。最後の例外だけ見ると、文字コードが原因だと気づきにくい形です。text=True の代わりに encoding="cp932" を渡すと、既定のままでも「日本語」と表示されました。

7. エラーメッセージの改善と、そのほかの変更

出典は正式版の What's New です。エラーメッセージ・re・strptime・PEP 810/814/798 は 3.15.0 で実行済みです。

他の言語のメソッド名に、Python の書き方を提案

書いたコードエラーに出る候補(What's New の例)
[1, 2, 3].push(4)Did you mean '.append'?
'hello'.toUpperCase()Did you mean '.upper'?
{}.put("a", 1)Use d[k] = v.

今の版での AttributeError の読み方はPythonエラー辞典の AttributeErrorにあります。

re.match() は使い続けてよい

「3.15 で re が非推奨」は言い過ぎです。同じ動作の re.prefixmatch() が追加され、re.match() は soft deprecated になります。公式の用語集によると、新しいコードでは使わない方がよいという位置づけです。警告は出ず、削除の予定もありません。re のドキュメントも、3.14 以前でも動かすコードは match() を使うよう書いています。削除されるのは sre_compile・sre_constants・sre_parse の3モジュールで、これらを直接 import するコードだけが対象です。

年のない書式の strptime は ValueError

datetime.strptime() は、書式に年がなく %d を含むと ValueError になります(例:"%m/%d")。年を足した文字列を "%Y/%m/%d" で読めば避けられます。書式コードは日付フォーマット早見表で引けます。

中級者向け:lazy import・frozendict・内包アンパック・JIT

  • lazy import(PEP 810):lazy import json で、最初に使うまで読み込みを遅らせる。モジュールのトップレベル専用で、関数の中に書くと SyntaxError
  • frozendict(PEP 814):変更できない辞書の組み込み型。キーと値がハッシュ可能なら辞書のキーにできる
  • 内包表記でのアンパック(PEP 798):[*L for L in lists] でリストのリストを平らにできる

3.14.7 では3つとも SyntaxError か NameError でした。性能面では実験的な JIT が強化され、Windows 64bit の公式バイナリは tail-calling インタープリターを採用します。向上幅は OS や計測条件で大きく変わるため、ここでは数字を書きません。

8. 上げる?待つ?旧版と共存させて試す

判断の軸は、自分のコードが encoding を省略しているか(4章)と、使うライブラリが 3.15 に対応しているかの2つです。両方を確かめるまでは、今の版を残して 3.15 を横に入れて試せば、壊れても元の環境で作業を続けられます。

pandas や NumPy のように Python の版ごとにビルド済みファイル(wheel)を配るライブラリは、PyPI の「Download files」にファイル名が cp315 を含むものがあるかで確かめられます。2026年10月12日時点では、numpy 2.5.4・pandas 3.0.6・matplotlib 3.11.2 に Windows 64bit 用の cp315 の wheel があり、wordcloud 1.9.6 にはありませんでした(PyPI)。3.15 へのインストールは当サイトでは試していません。

.exe インストーラーは 3.15 が最後

3.15 版の Using Python on Windows によると、従来の .exe インストーラーは 3.16 以降は作られません(3.15.0 の .exe は配布中)。公式の推奨は Python install manager です。違いはPythonインストール解説の3章を見てください。

py で旧版と共存させる

py list              # 入っている版の一覧(install manager)
py -V:3.15 app.py    # 3.15 で実行(公式発表版なら py -3.15 と省略可)
py -3.14 app.py      # 同じスクリプトを 3.14 で実行して比べる

install manager での追加は py install 3.15 と3.15.0 のリリースページにあります。当サイトは install manager・従来の py ランチャーとも 3.15 では試しておらず、py -3.15 などの動作は未確認です。winget には2026年10月12日時点で Python.Python.3.15 が未登録でした。pip を版ごとに分ける書き方はpy ランチャーと複数バージョンの共存にあります。

3.14 もバグ修正の期間中なので(バージョンの選び方)、すぐ上げる必要はありません。

9. よくある質問(FAQ)

Q. Python 3.15 はいつリリースされましたか?

正式版の 3.15.0 は2026年10月9日にリリースされました(python.org のリリースページと PEP 790 で確認)。

Q. 3.15 にすると Shift_JIS の CSV は必ず読めなくなりますか?

いいえ。影響するのは encoding を省略して読む場合だけで、半角の英数字・記号(ASCII)だけのファイルは省略でも読めます。日本語を含む cp932 のファイルを省略で読むと、多くの場合 UnicodeDecodeError になります。

Q. UTF-8 モードが有効かどうかを確かめる方法は?

import sys; print(sys.flags.utf8_mode) が 1 なら有効、0 なら無効です。3.14 以前の既定は 0 でした。

Q. PYTHONUTF8=0 を設定すれば、今までどおり使い続けられますか?

設定した PC と起動方法では 3.14 までと同じ動きになります。ただし設定のない PC や起動方法では UTF-8 に戻ります。encoding を書く方が、どこで動かしても結果が同じです。

Q. re.match() は使えなくなりますか?

使えます。soft deprecated は警告が出ず、削除の予定もありません。新しく書くコードでは同じ動作の re.prefixmatch() も選べます。

本記事は、生成AIを活用して下書きし、運営者が内容を確認・編集したうえで公開しています。AIの利用方針は免責事項をご覧ください。

10. まとめ

  • 3.15 では encoding を省略した読み書きが cp932 から UTF-8 に変わる
  • cp932 の CSV を省略で読むコードは、再現で UnicodeDecodeError になった。直し方は encoding="cp932"
  • 上げる前に -X warn_default_encoding で洗い出し、py で旧版と共存させて試す
  • pandas の read_csv() と re.match() は、3.15 のために直す必要はない

Excel ファイルを直接作るならPythonでExcel作業を自動化へ。

📌
参考にした一次情報と検証環境(3.15.0 での実測は2026年10月12日)

What's New in Python 3.15(正式版)/PEP 686/PEP 790/3.15.0 リリースの告知(discuss.python.org)/3.15 版の open()・EncodingWarning・subprocess を参照。出力は Windows 11 で Python 3.15.0 の embeddable 版を2026年10月12日に実行して得たものです。pandas の結果は Python 3.12.10、3.14 の結果は 3.14.7(ともに9月28日)です。