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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With