11

我正在编写一个 Python 脚本,它接受文件路径作为字符串,解析它们,附加命令名,并构建一个列表,然后将其传递给subprocess.Popen()执行。该脚本用于处理 Unix 和 Windows 文件路径,最终应该在两个系统上运行。

当我在 Unix 下运行它时,如果我给出一个无意中包含转义字符(例如\Users\Administrator\bin)的 Windows 路径,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, \t, \v- 但不是\x

有没有更蟒蛇的方式来做到这一点?

4

2 回答 2

16

如果你winpath是硬编码的,你可能想r在你的字符串之前使用来表示它是一个“原始字符串”

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

如果winpath无法硬编码,您可以尝试创建一个新字符串:

escaped_winpath = "%r" % winpath

(这只是repr(winpath),并且不会真正帮助你,因为repr("\bin")......)

一个解决方案是从头开始重建字符串:您可以在该链接上找到一个函数示例,但一般的想法是:

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

于 2012-09-26T15:24:12.697 回答
7

您可以通过将 r 添加到字符串文字符号来创建原始字符串

r"hello\nworld"

变成

"hello\\nworld"

你可以在这里阅读更多

于 2012-09-26T15:27:09.060 回答