11

subprocess.Popen()ファイル パスを文字列として受け取り、それらを解析し、コマンド名を追加し、実行のために渡されるリストを作成する Python スクリプトを作成しています。このスクリプトは、Unix と Windows の両方のファイル パスを処理するためのものであり、最終的には両方のシステムで実行する必要があります。

これを Unix で実行するときに、誤ってエスケープ文字 (例: \Users\Administrator\bin) を含む Windows パスを指定すると、Python は埋め込ま\bれた文字をバックスペース文字として解釈します。そうならないようにしたい。

私の知る限り、文字列変数を生の文字列として表す関数やメソッドはありません。修飾子は'r'、文字列定数に対してのみ機能します。

これまでのところ、私が得ることができた最も近いものはこれです:

winpath = "C:\Users\Administrator\bin" 
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\') 

この時点で、winpathlist には['C:','Users','Administrator','bin']ではなくが含まれている必要があり['C','Users','Administrator\x08in']ます。

winpath.replace()取得する可能性のある他のエスケープを処理するためにへの呼び出しを追加することはできますが、\aそれはできません。\f\n\r\t\v\x

これを行うためのよりPythonicな方法はありますか?

4

2 に答える 2

16

winpathがハードコードされている場合は、文字列の前に使用して、それが「生の文字列」rであることを示すことができます。

winpath = r"C:\Users\Administrator\bin"

winpathハードコーディングできない場合は、次のように新しい文字列を作成してみてください。

escaped_winpath = "%r" % winpath

(これはただrepr(winpath)のことであり、そのままでは実際には役に立ちませんrepr("\bin")...)

解決策は、文字列を最初から再構築することです。そのリンクで関数の例を見つけることができますが、一般的な考え方は次のとおりです。

escape_dict={'\a':r'\a',
             '\b':r'\b',
             '\c':r'\c',
             '\f':r'\f',
             '\n':r'\n',
             '\r':r'\r',
             '\t':r'\t',
             '\v':r'\v',
             '\'':r'\'',
             '\"':r'\"'}

def raw(text):
    """Returns a raw string representation of text"""
    new_string=''
    for char in text:
        try: 
            new_string += escape_dict[char]
        except KeyError: 
            new_string += char
    return new_string

そして今、raw("\bin")あなたに"\\bin"(そしてそうではない"\\x08in")...

于 2012-09-26T15:24:12.697 に答える
7

文字列リテラル表記の前に r を追加することで生の文字列を作成できます

r"hello\nworld"

になる

"hello\\nworld"

ここでさらに読むことができます

于 2012-09-26T15:27:09.060 に答える