我正在编写一个Python脚本,它接受文件路径作为字符串,解析它们,附加命令名称,并构建一个列表,然后传递给subprocess.Popen()
执行。此脚本用于处理Unix和Windows文件路径,最终应在两个系统上运行。
当我在Unix下运行时,如果我给出一个无意中包含转义字符的Windows路径(例如\Users\Administrator\bin
),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
,{{ 1}},\t
- 但不是\v
。
有更多的pythonic方法吗?
答案 0 :(得分:8)
如果您的winpath
是硬编码的,则可能需要在字符串前使用r
来表明它是"raw string"。
winpath = r"C:\Users\Administrator\bin"
如果winpath
无法硬编码,您可以尝试创建一个新字符串:
escaped_winpath = "%r" % winpath
(只是repr(winpath)
,并不会真正帮助你,因为repr("\bin")
是......)
解决方案是从头开始重建字符串:您可以在that link找到一个函数示例,但通用的想法是:
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"
)......
答案 1 :(得分:4)