プログラミング
PR

Pythonで日本語パスがエラーになる原因と解決法|相対パス・絶対パス・エンコードの基本を解説

ながみえ
本記事には広告(アフィリエイトリンク)が含まれます。リンク経由で申込が発生した場合、当サイトが報酬を受け取る可能性があります。

Pythonでファイルを読み込んだり保存したりするとき、「ファイルが見つかりません」や「UnicodeEncodeError」というエラーに出会ったことはありませんか?

特に日本語を含むパス(例:C:\ユーザー\ドキュメント\テスト.txt)を扱うと、「なぜエラーになるの?」と戸惑う人が多いのが現実です。

実はこの問題、Pythonの仕様だけでなく、Windowsの文字コードやパスの考え方にも関係しています。

この記事では、初心者でも分かるように、

  • 相対パスと絶対パスの違い
  • 日本語パスでエラーが出る理由
  • そして安全に扱うための実践的な書き方

を順番に解説していきます。

一度理解してしまえば、ファイル操作のつまずきがぐっと減ることでしょう。

スポンサーリンク

もくじ

相対パスと絶対パスの違いを理解しよう

Pythonでファイルを指定するときには、主に「絶対パス」と「相対パス」という2つの書き方があります。

これはPythonだけでなく、ほとんどのプログラミング言語やOSで共通する概念です。

絶対パスとは

絶対パスとは、ファイルの場所をドライブ名からすべて指定する方法です。

たとえば:

file_path = "C:/Users/Example/Documents/data.txt"

このように書けば、どこでプログラムを実行しても必ず同じファイルを参照します。

絶対パスは確実ですが、他の環境に移すと動かなくなるという弱点があります。
(例:別のPCではユーザー名が違う、ディレクトリ構造が違う、など)

相対パスとは

相対パスは、「今いる場所(作業ディレクトリ)」を基準にファイルを指定する方法です。

たとえば、プログラムと同じフォルダに data.txt があるなら、

file_path = "./data.txt"

と書けます。

この場合、"./" は「現在のフォルダ(カレントディレクトリ)」を意味します。

より深いフォルダにある場合は:

file_path = "./data/input/sample.txt"

のように指定します。

注意:相対パスは「どこから実行するか」で変わる

ここで多くの初心者が混乱するポイントがあります。

それは「相対パスの基準がスクリプトの場所ではなく、実行場所によって変わる」という点です。

たとえば、main.pyC:/project/ にあり、データファイルが C:/project/data/test.txt にあるとします。

このとき、以下のように書いても:

file_path = "./data/test.txt"

コマンドプロンプトで別の場所から実行すると、ファイルが見つからない場合があります。

なぜなら、Pythonは「現在の作業ディレクトリ(current working directory)」を基準に相対パスを解釈するためです。

作業ディレクトリは os.getcwd() で確認できます:

import os
print(os.getcwd())

pathlibで安全に扱う

このようなトラブルを防ぐために、Pythonではpathlibモジュールを使うことが推奨されています。

pathlibを使えば、OSの違いやスラッシュの向き(/\)を気にせずに済みます。

from pathlib import Path

base = Path(__file__).parent
file_path = base / "data" / "test.txt"
print(file_path)

この書き方なら、スクリプトの場所を基準にファイルパスを組み立てることができます。

これが「どこから実行しても動く安全なパス指定」の第一歩です。

あわせて読みたい
Pythonのpathlibライブラリの使い方ガイド
Pythonのpathlibライブラリの使い方ガイド
【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

日本語パスでエラーが出るのはなぜ?

Pythonを使っていて、ファイル名やパスに日本語が含まれると、次のようなエラーを見たことはありませんか?

UnicodeEncodeError: 'cp932' codec can't encode character '\u30c6' in position 0: illegal multibyte sequence

突然このようなメッセージが出ると、「日本語が悪いの?」「Windowsのせい?」と混乱してしまいますよね。

でも、実はこのエラーにはきちんとした理由があります。

文字コード(エンコーディング)とは何か?

まず理解しておきたいのが「文字コード(エンコーディング)」という考え方です。

コンピュータは文字をそのまま扱うことができません。

「A」や「テスト」といった文字は、内部的には数値(バイト)として保存されています。

この“文字と数値の対応表”を決めているのが、文字コードです。

代表的なものに以下のような種類があります:

文字コード読み方主な用途
UTF-8ユーティーエフエイト世界標準(PythonやWebで主流)
Shift_JISシフトジス日本語Windowsで長く使われてきた
CP932シーピーキューハチサンニShift_JIS互換のWindows専用拡張

PythonはUTF-8を標準として動作していますが、Windowsの一部では今でもCP932(=Shift_JISの一種)がデフォルトとして使われています。

この「文字コードのズレ」が、日本語パスのエラーを引き起こす最大の原因です。

なぜ日本語パスでエラーが出るのか?

Pythonはファイルを開くとき、内部的にOSの文字コードを使ってパスを処理します。

その際、Python(UTF-8)とWindows(CP932)の間で変換がうまくいかないと、「この文字は表現できません!」というエラーになります。

たとえば、次のようなコード:

with open("C:/ユーザー/テスト.txt", "w") as f:
    f.write("こんにちは")

このとき、"ユーザー" の部分が CP932で表現できない文字を含む場合、Pythonはエラーを出して止まってしまいます。

つまり、日本語のファイル名そのものが問題ではなく、「エンコード方式の不一致」が問題なのです。

エンコーディングエラーを再現してみよう(例)

試しに次のようなコードを実行してみてください:

with open("日本語ファイル.txt", "w", encoding="cp932") as f:
    f.write("🐍Python")

これを実行すると、多くの環境で次のようなエラーが出ます。

UnicodeEncodeError: 'cp932' codec can't encode character '\U0001F40D' in position 0

これは、絵文字(🐍)がCP932の範囲外だからです。

同じことが日本語パスにも起こりうる、ということですね。

対策①:UTF-8を明示的に使う

Pythonのopen()関数では、エンコーディングを明示することが最も安全です。

with open("C:/ユーザー/ドキュメント/テスト.txt", "w", encoding="utf-8") as f:
    f.write("こんにちは!")

このように書けば、PythonがUTF-8で統一して処理するため、日本語パスや文字列を安全に扱うことができます。

対策②:pathlibを使ってパス文字列を安全に扱う

もうひとつ重要なのが、pathlibでパスをオブジェクトとして扱うことです。

from pathlib import Path

path = Path("C:/ユーザー/ドキュメント/テスト.txt")
with open(path, "w", encoding="utf-8") as f:
    f.write("Pythonから日本語パスに書き込み成功!")

pathlibを使うと、パスの結合やスラッシュ方向(/\)を自動で調整してくれます。

また、WindowsでもUnicode対応がしっかりしているため、日本語パスによるエラーをほぼ完全に防げるのがポイントです。

対策③:古い環境ではシステム設定をUTF-8に統一する

もし古いWindows環境で、どうしても文字化けやエラーが続く場合は、「システムロケールをUTF-8対応」にすることも検討できます。

  • コントロールパネル → 言語と地域 → 管理 → 「ベータ版:Unicode UTF-8を使用」にチェック
  • これにより、CP932ではなくUTF-8でPythonが動作しやすくなります

ただし、他の古いアプリケーションで副作用が出ることもあるので注意が必要です。

まとめ:日本語パスエラーの正体

  • 日本語そのものは悪くない
  • 問題は「文字コードのズレ(UTF-8 vs CP932)」
  • encoding="utf-8" を指定し、pathlibを使えば解決できる

つまり、Pythonで日本語パスを安全に扱うには:

「pathlib+UTF-8明示」をセットで使うのが最強の解決策です。

あわせて読みたい
オブジェクト指向とは何か|コードの向こうにある思想を読み解く
オブジェクト指向とは何か|コードの向こうにある思想を読み解く
あわせて読みたい
プログラミングの歴史 ― 計算機から創造の言語へ
プログラミングの歴史 ― 計算機から創造の言語へ

日本語パスを正しく扱う3つの方法

ここまでで、Pythonで日本語パスがエラーになる理由を理解できたと思います。

次は、実際にどう書けばエラーを防げるのかを具体的なコードで見ていきましょう。

ポイントは3つだけです。

1️⃣ pathlibでパスを扱う
2️⃣ encodingを明示する
3️⃣ URLエンコードを使って外部連携にも対応する

それぞれ順を追って解説します。

方法①:pathlibで統一的に扱う(最も安全な方法)

Python 3.6以降では、pathlibモジュールが標準で利用できます。

これを使えば、パスを文字列としてではなく「オブジェクト」として安全に操作できます。

例えば、次のように書くと分かりやすいです:

from pathlib import Path

# 日本語を含むパスを定義
path = Path("C:/ユーザー/ドキュメント/テスト.txt")

# ファイルの存在をチェック
print(path.exists())

# ファイルに書き込み
path.write_text("こんにちは!Pythonからの書き込みです。", encoding="utf-8")

# 内容を読み込み
text = path.read_text(encoding="utf-8")
print(text)

この書き方のメリット

  • pathlibはOSの違いを吸収してくれる(Windows・macOS・Linux対応)
  • スラッシュ(/ or \)を気にしなくてよい
  • 日本語を含むパスでもエラーが起きにくい
  • .write_text().read_text() が 自動でエンコード対応してくれる

つまり、Pythonでファイルを扱うときはまず「pathlibを使う」というのが第一歩です。

方法②:ファイル操作時にエンコードを明示する

もうひとつの基本は、open()関数を使う場合に常にエンコードを指定することです。

デフォルトでは環境依存のエンコード(WindowsならCP932)を使うため、日本語や絵文字が混ざるとエラーになりやすいのです。

# 正しい書き方
with open("日本語ファイル.txt", "w", encoding="utf-8") as f:
    f.write("PythonでUTF-8を指定すれば安心!")

# 読み込みも同様に
with open("日本語ファイル.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)
  • encoding="utf-8"を毎回書くクセをつけると、環境依存のバグをほぼ防げます。
  • 特に日本語を含むデータファイル(CSV, TXT, JSON)を扱うときは必須です。

方法③:URLエンコードを使う(応用テクニック)

もしPythonのスクリプトがWeb APIや外部システムと連携する場合、ファイルパスに日本語を含むと通信エラーになるケースがあります。

その場合は、「URLエンコード」を使うと安全です。

Pythonでは urllib.parse モジュールで簡単に扱えます。

from urllib.parse import quote, unquote

# 日本語パスをURL形式に変換
original_path = "C:/ユーザー/ドキュメント/テスト.txt"
encoded = quote(original_path)
print(encoded)  # 出力例: C%3A%2F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%2F...

# URL形式から元に戻す
decoded = unquote(encoded)
print(decoded)  # 元のパスに戻る

このように、URL形式(%E3%83…のような形)に変換しておけば、文字化けやAPIエラーを防げるので、システム間連携のときに非常に役立ちます。

3つの方法の比較まとめ

方法メリット注意点
pathlib最も安全でモダン。OS依存なしPython 3.6以降が前提
encoding指定既存コードにも適用しやすい指定を忘れると環境依存に
URLエンコード外部連携・Web対応に強い人間には読みにくくなる

実務的なおすすめ組み合わせ

実務で一番安定するのはこの組み合わせです👇

from pathlib import Path

# スクリプトの場所を基準にファイルを扱う
base = Path(__file__).parent
file_path = base / "data" / "日本語ファイル.txt"

# UTF-8で安全に読み書き
file_path.write_text("こんにちは!ファイル操作成功。", encoding="utf-8")
print(file_path.read_text(encoding="utf-8"))

これなら:

  • どのPCでも動く
  • 日本語でもエラーにならない
  • フォルダ構成が変わっても簡単に追従できる

まさに “Windows実務でも通用するPythonファイル操作” です。

オブジェクト指向プログラミングを学ぶ若者のイラスト。ノートパソコンに向かって考え込む姿の背景には、クラスやオブジェクトの概念図、フローチャート、コードが表示された黒板があり、本棚にはプログラミング関連の書籍が並ぶ。

よくあるエラーとその解決法

ここまでで、安全なファイルパスの扱い方やエンコード指定の基本を理解できたと思います。

ですが、実際の現場では「何が原因なのか分からないエラー」に悩まされることが少なくありません。

この章では、Windows+Pythonで日本語パスを扱うときに頻発するエラーと、それぞれの「原因」と「確実な対処法」を整理して解説します。

1. FileNotFoundError(ファイルが見つからない)

エラー内容

FileNotFoundError: [Errno 2] No such file or directory: 'data/test.txt'

原因

  • 相対パスの基準がズレている(多くの初心者がここでつまずきます)
  • スクリプトの実行場所と、ファイルの実際の場所が一致していない

対処法

✅ 対策1:実行時のカレントディレクトリを確認

import os
print(os.getcwd())  # 現在の作業ディレクトリを表示

✅ 対策2:スクリプトの場所を基準にパスを指定

from pathlib import Path
base = Path(__file__).parent
file_path = base / "data" / "test.txt"
print(file_path.exists())  # TrueならOK

Path(__file__).parent を使うと、どの場所から実行しても動く安定したスクリプトになります。

2. UnicodeEncodeError(文字コード関連エラー)

エラー内容

UnicodeEncodeError: 'cp932' codec can't encode character '\u3042' in position 0

原因

  • Windowsの標準文字コード(CP932)が、
    Pythonの内部文字コード(UTF-8)と不一致
  • ファイル名や中身に、CP932で表現できない文字(例:絵文字、機種依存文字)が含まれている

対処法

✅ 対策1:常にUTF-8を明示してファイルを開く

with open("テスト.txt", "w", encoding="utf-8") as f:
    f.write("こんにちは")

✅ 対策2:pathlibを利用する

from pathlib import Path
path = Path("C:/ユーザー/ドキュメント/日本語ファイル.txt")
path.write_text("UTF-8で書き込み成功!", encoding="utf-8")
  • UTF-8指定で問題が解決するケースが圧倒的に多い
  • どうしてもShift_JISのデータを扱う必要がある場合は encoding="cp932" を指定する

3. OSError(パス書式エラー)

エラー内容

OSError: [Errno 22] Invalid argument: 'C:\new\test.txt'

原因

  • Windowsでバックスラッシュ(\)がエスケープ文字として誤認識される
    (例:\n → 改行、\t → タブ)
  • 手入力でパスを書いたときに "C:\new\test.txt" のような記述をしてしまう

対処法

✅ 対策1:スラッシュを / に統一する

path = "C:/new/test.txt"

✅ 対策2:raw文字列を使う(rプレフィックス)

path = r"C:\new\test.txt"

✅ 対策3:pathlibを使う(最強の方法)

from pathlib import Path
path = Path("C:/new/test.txt")

pathlibはスラッシュの違いを自動で処理してくれるため、OS依存のパスエラーを根本的に防げます。

4. PermissionError(アクセス拒否)

エラー内容

PermissionError: [Errno 13] Permission denied: 'C:/Program Files/test.txt'

原因

  • システム保護領域(例:Program Files, Windowsフォルダなど)に書き込みを試みている
  • 管理者権限がないフォルダにアクセスしている

対処法

  • ファイルを閉じ忘れていないか確認する
    (別のプログラムで開いたままだとPermissionErrorになる)
  • ユーザーのドキュメントフォルダやプロジェクトフォルダ内で作業する

エラー対応まとめ表

エラー名主な原因対処法
FileNotFoundError相対パスのズレPath(__file__).parentを基準に指定
UnicodeEncodeError文字コードの不一致encoding="utf-8"を明示
OSErrorバックスラッシュ誤認/に統一 or Path使用
PermissionError権限不足書き込み先を変更/ファイルを閉じる

エラーを防ぐ3つの原則

最後に、これらのエラーを根本から防ぐための「三原則」を覚えておきましょう👇

1️⃣ pathlibを使う – パス文字列を直接書かない
2️⃣ UTF-8を指定する – 書き込み/読み込み時は必ず encoding="utf-8"
3️⃣ 相対パスの基準を固定する – Path(__file__).parent で確実に

この3点を守れば、日本語パスを扱ってもほとんどのエラーは未然に防げます。

あわせて読みたい
コードとスクリプトの違いをわかりやすく解説!
コードとスクリプトの違いをわかりやすく解説!
あわせて読みたい
Python標準ライブラリの厳選おすすめ11選【初心者から上級者まで必見】
Python標準ライブラリの厳選おすすめ11選【初心者から上級者まで必見】

まとめ|日本語パスも怖くない!

ここまで読んでくださったあなたは、Pythonで日本語パスを扱うときに起こる「謎のエラー」の正体が、実は文字コードとパスの仕組みの問題だったということを理解できたと思います。

実務で役立つ安全な書き方テンプレート

以下のコードは、日本語パス対応+安全なファイル操作の完全テンプレートです。

この形を使えば、ほぼどんな環境でも安定して動作します。

from pathlib import Path

# スクリプトのあるフォルダを基準に安全なパスを作る
base_dir = Path(__file__).parent
file_path = base_dir / "data" / "日本語ファイル.txt"

# UTF-8で書き込み
file_path.write_text("こんにちは!Pythonで安全に書けました。", encoding="utf-8")

# UTF-8で読み込み
content = file_path.read_text(encoding="utf-8")
print(content)

この書き方を覚えておくだけで、初心者がつまずきやすいファイル関連のトラブルを一気に回避できます。

よくあるトラブルを防ぐチェックリスト

チェック項目状況対策
ファイルが見つからない相対パスのズレPath(__file__).parentで基準固定
日本語ファイル名でエラー文字コード不一致encoding="utf-8"を指定
バックスラッシュでエラー\n\t誤認/を使う or Path利用
外部連携で文字化けURL未エンコードurllib.parse.quote()を使う
Windowsで動くのに他OSで動かないOS依存パス記法pathlibで統一

最後に:日本語パスは「避けるべき」ではなく「正しく扱えば安全」

かつては「日本語ファイル名はやめたほうがいい」と言われてきました。

しかし、今のPython(3.6以降)ではUnicode対応がしっかりしており、正しい手順を踏めば日本語パスを安心して使えます。

お疲れさまでした!

これであなたも、もう“日本語パスで悩まないPython使い”です。

あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド
あわせて読みたい
Pythonの基礎学習を終えたあなたへ:次に進むべき道と実践方法
Pythonの基礎学習を終えたあなたへ:次に進むべき道と実践方法
スポンサーリンク
ABOUT ME
ながみえ
ながみえ
記事URLをコピーしました