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.