かゆい所に手が届く解説

Pythonでエスケープシーケンスを無視(回避)する方法

Pythonのスクリプト内でファイルやアプリケーションのパスを指定する場合、そのままでは思った通りの処理ができない場合があります。

この記事では、エスケープシーケンスとなる記述を無視(回避)する方法を解説しています。

エスケープシーケンスが原因でエラーになる事例

例えば、下のスクリプトを実行するとエラーが出てしまいます。

(スクリプトの詳しい説明は後述します。)

import subprocess

notepad = "C:\Windows\System32\notepad.exe"

subprocess.run(notepad)

その理由は、パスの中に「\n」が含まれており、これは「改行」を意味するエスケープシーケンスだからです。

この記事では、その問題を解決する方法をご紹介します。

基本①

なお、Python は文字列を囲む場合に「 ‘ (シングルクォーテーション)」でも「” (ダブルクォーテーション)」でもどちらでもOKです。

記事内では、あえてどちらも使っています。

基本②

また、Windows ではパスを表す際「C:¥」となりますが、スクリプト上では「C:\」のように¥マークが \ バックスラッシュであらわされます。

一応、補足として説明しておきます。

エスケープシーケンスとは

特別な意味を持つ文字を表すために使われる記号です。

例えば、改行を意味するエスケープシーケンスは「\n」です。

例として、文字列の中に「\n」を入れて print してみます。

print('これは、\nリンゴです')

実行すると、

これは、
リンゴです

となります。

他にも、代表的なものは以下のエスケープシーケンスがあります。

エスケープシーケンス意味
\tタブ
\bバックスペース
\’シングルクォーテーション
\”ダブルクォーテーション
\\(一つだけの)バックスラッシュ
\r復帰(キャリッジリターン)
\fフォームフィード

エスケープシーケンスを回避する方法①

最初に紹介するのは、raw文字列を使った方法です。

raw文字列とは

「そのまま」とか「生で」という意味です。

文字として認識(処理)したいのに、エスケープシーケンスとして認識(処理)されてしまうことを防ぐために使用します。

文字通り、「文字列をそのまま処理したい、表示したい」という場合ですね。

このとき、クォート文字(”)の前に「r」を付けることで、エスケープシーケンスを無効にし、すべての文字を「生の文字として」認識(処理)することができます。

raw文字列の基本

それでは、先ほどと同じ print文を raw文字列で処理してみましょう。

print(r'これは、\nリンゴです')

違いは「r」を付けただけ。実行すると、

これは、\nリンゴです

となります。

「\nって何?」となりますので、普通はこのような使い方はしませんね。

エスケープシーケンスを回避する方法②

では、もう少し実践的な場面をご紹介します。

サンプルスクリプトの説明

例として、Python からメモ帳を起動するスクリプトを用意しました。

import subprocess

notepad = "C:\Windows\System32\notepad.exe"

subprocess.run(notepad)

Windows においてメモ帳は「C:\Windows\System32」にあります。

ファイル名は「notepad.exe」です。

これを呼び出すため、上のスクリプトでは 変数 notepad にパスを「C:\Windows\System32\notepad.exe」のように入れて、subprocess.run で変数 notepad を引数に指定するとメモ帳が実行されます。

エラーになる場合

この場合、メモ帳のパスそのままでは「\n」がエスケープシーケンスとして認識されてしまいます。

エスケープシーケンスとして認識されてしまう例
import subprocess

notepad = "C:\Windows\System32\notepad.exe"

subprocess.run(notepad)

実行すると、下のようにエラーになります。

Traceback (most recent call last):
  File "C:\Users\papa3\デスクトップ\test.py", line 5, in <module>
    subprocess.run(notepad)
  File "C:\Users\papa3\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 505, in run
    with Popen(*popenargs, **kwargs) as process:
  File "C:\Users\papa3\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\papa3\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 1420, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。

長文ですが、要は「ファイルが見つからない」というエラーです。

raw文字列でエラーを回避する

その対策としてr aw文字列を使います。

スクリプト内にraw文字列を使う方法
import subprocess

notepad = r"C:\Windows\System32\notepad.exe"

subprocess.run(notepad)

このスクリプトを実行すると、メモ帳が起動します。

無事に実行できた図

エスケープシーケンスを回避して、実行することができました。

raw文字列を使わない方法

上の例と同じことを、raw文字列を使わずに処理する方法がありますのでご紹介します。

通常、パスを表すときは「\」を一つしか入れませんが、ここを「\\」のように二つにします。

raw文字列を使わない方法の解説
import subprocess

notepad = "C:\\Windows\\System32\\notepad.exe"

subprocess.run(notepad)

こうすることで、raw文字列を使わなくても、パスを表すことができるのです。

結果は同じなので、どちらでもOKです。

まとめ

今回はPythonにおけるエスケープシーケンスについて解説しました。

覚えておく必要はないけれど、困ったときにまた見に来てください。

他にも何か質問や疑問がある場合はフォームやコメントでお知らせください。

Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。

それでは、ステキなPythonライフを!

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 最近ではPythonを用いたアプリ開発、ウェブアプリケーションの開発と運営に没頭。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です