相关文章推荐
Contents
  1. エスケープシーケンスが原因でエラーになる事例
  2. エスケープシーケンスとは
  3. エスケープシーケンスを回避する方法①
  4. エスケープシーケンスを回避する方法②
  5. raw文字列を使わない方法
  6. まとめ

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

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

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

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ライフを!

 
推荐文章