2

今日、データを処理し、カスタマイズされた形式で印刷するための Python スクリプトを作成しました。インタラクティブな Python で期待どおりに動作しました。次に、ターミナルで出力をテキスト ファイルにリダイレクトしようとしたところ、予期しない事態が発生しました。

私が試した特定の例は、データのリストを列に配置し、LaTeX 表形式で出力することでした。多かれ少なかれ次のように機能します。

foo(mylist, sep_col='\t', sep_row=r'\\ \hline')

ターミナルでスクリプトを実行しようとしたとき、次のようにしました。

$ python -c "from foo import foo; foo(mylist, col_sep=' & ', row_sep=r' \\ \hline')" > results.txt

\\ \hlineしかし、その部分は のように表示されていることが判明しました\ \hline。これは、インタラクティブな Python とは異なります。

問題 (またはその背後にある原則) をさらに詳しく調べたところ、によって処理された Python スクリプトの動作は、$ python -c対話型 Python では同じではないことがわかりました。

インタラクティブな Python では>>> print r'\\':\\

ただし、ターミナルで$ python -c "print r'\\'"は、次のようになりSyntaxErrorます。

  File "<string>", line 1
    print r'\'
             ^
SyntaxError: EOL while scanning string literal

バックスラッシュの数が 3 または 4 の場合にターミナルが表示されるようです\\。5 または 6 の場合はエラーが発生します。7 つのバックスラッシュは Giveを意味します。これは、この環境で\\\\は Give の方法がないことを意味します。\\\

私はかなり長い間この問題を探してきましたが、$ python -c. 重複した場合は事前に申し訳ありません。

4

3 に答える 3

2

ターミナルで、次のように言います。

$ python -c "print r'\\'"
  File "<string>", line 1
    print r'\'
             ^
SyntaxError: EOL while scanning string literal

シェルが機能するため、エラーが発生します。これは(エラー メッセージを注意深く参照してください)に変換 \\されます。\

代わりに言う

$ python -c 'print r"\\"'
\\

シェルから実行する場合、つまり、コマンドを一重引用符で囲み、引数をprint二重引用符で囲みます。

対話モードで実行していたコマンドに相当するものは次のとおりです。

$ python -c "print r'\\\\'"
\\

編集:この回答は、生の文字列に奇数のバックスラッシュを含めることができない理由を説明しています。

また、公式FAQでも説明されています。

于 2013-08-23T12:25:20.313 に答える
0

端末は生の文字列または正規表現文字列を認識しません。つまりr'something'、特別なものとして、すべてのバックスラッシュは端末のバックスラッシュでエスケープする必要があるため、次のようになります。

python -c "from foo import foo; foo(mylist, col_sep=' & ', row_sep=r' \\ \hline')" > results.tx

する必要があります:

python -c "from foo import foo; foo(mylist, col_sep=' & ', row_sep=r' \\\\ \\hline');" > results.tx

foo(mylist, sep_col='\t', sep_row=r'\\ \hline')

次のようにマッピングされます:

python -c "from foo import foo; foo(mylist, sep_col='\\t', sep_row=r'\\\\ \\hline');"
于 2013-08-23T12:27:19.177 に答える