Python 3.15 で何が変わる?UTF-8 デフォルト化で確認する5点
Python 3.15 では、encoding を書かずに開いたファイルが UTF-8 で読み書きされるようになります。日本語 Windows で Shift_JIS(cp932)の CSV を読んでいるコードが止まるかどうかを、上げる前に確認する手順です。
結論:Python 3.15 では UTF-8 モードが既定(デフォルト)になり、encoding を書かずに開いたファイルは cp932 ではなく UTF-8 で読み書きされます。日本語 Windows で Shift_JIS(cp932)の CSV を encoding なしで読んでいるコードは、多くの場合 UnicodeDecodeError で止まります。直し方は encoding="cp932" を書き足すことです。
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 モードで読む
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_mode | cp932 の CSV(省略) | UTF-8 の CSV(省略) | encoding="cp932" |
|---|---|---|---|---|
OFF(3.14 までの既定・3.15.0 で -X utf8=0) | 0 | 読める | UnicodeDecodeError | 読める |
| ON(3.15.0 の既定) | 1 | UnicodeDecodeError | 読める | 読める |
逆に、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作業を自動化へ。
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日)です。