简体   繁体   中英

How to prevent automatic escaping of special characters in Python

I'm writing a Python script that accepts file paths as strings, parses them, appends a command name, and builds a list, which is then passed to subprocess.Popen() for execution. This script is to handle both Unix and Windows file paths, and ultimately should run on both systems.

When I run this under Unix, if I give a Windows path that inadvertently contains an escape character (eg \\Users\\Administrator\\bin ), Python will interpret the embedded \\b as the backspace character. I want to prevent that from happening.

As far as I know, there's no function or method to denote a string variable as a raw string. The 'r' modifier only works for string constants.

So far, the closest I've been able to get is this:

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

At this point, winpathlist should contain ['C:','Users','Administrator','bin'] , not ['C','Users','Administrator\\x08in'] .

I can add additional calls to winpath.replace() to handle the other escapes I might get -- \\a , \\f , \\n , \\r , \\t , \\v -- but not \\x .

Is there a more pythonic way to do this?

If your winpath is hard-coded, you may want to use r before your string to indicate it is a "raw string" .

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

If winpath cannot be hardcoded, you can try to create a new string as:

escaped_winpath = "%r" % winpath

(which is just repr(winpath) , and won't really help you, as repr("\\bin") is...)

A solution would be to rebuild the string from scratch: you can find an example of function at that link , but the generic idea is:

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

and now, raw("\\bin") gives you "\\\\bin" (and not "\\\\x08in" )...

You can create a raw string by prepending r to the string literal notation

r"hello\nworld"

becomes

"hello\\nworld"

You can read some more here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM