Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 (e.g. \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?

like image 924
poltr1 Avatar asked Sep 26 '12 15:09

poltr1


2 Answers

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")...

like image 164
Pierre GM Avatar answered Sep 22 '22 19:09

Pierre GM


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

like image 44
thenoviceoof Avatar answered Sep 21 '22 19:09

thenoviceoof