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文字列を使います。
import subprocess
notepad = r"C:\Windows\System32\notepad.exe"
subprocess.run(notepad)
このスクリプトを実行すると、メモ帳が起動します。
エスケープシーケンスを回避して、実行することができました。
raw文字列を使わない方法
上の例と同じことを、raw文字列を使わずに処理する方法がありますのでご紹介します。
通常、パスを表すときは「\」を一つしか入れませんが、ここを「\\」のように二つにします。
import subprocess
notepad = "C:\\Windows\\System32\\notepad.exe"
subprocess.run(notepad)
こうすることで、raw文字列を使わなくても、パスを表すことができるのです。
結果は同じなので、どちらでもOKです。
まとめ
今回はPythonにおけるエスケープシーケンスについて解説しました。
覚えておく必要はないけれど、困ったときにまた見に来てください。
他にも何か質問や疑問がある場合はフォームやコメントでお知らせください。
Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。
それでは、ステキなPythonライフを!