逃离窗户的路径Delimi

2024-04-25 23:17:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要通过转义windows路径分隔符来更改此字符串。我自己没有定义原始字符串,所以不能预先挂起原始字符串'r'。

我需要这个:

s = 'C:\foo\bar'

要做到这一点:

s = 'C:\\foo\\bar'

我在这里和其他地方所能找到的一切都表明:

s.replace( r'\\', r'\\\\' )

(为什么我必须在无法想象的原始字符串中转义字符)

但打印字符串会导致这种情况。显然,有人决定重新解释修改后字符串中的转义:

C:♀oar

在Perl中这将非常简单。如何用Python解决这个问题?


Tags: 字符串路径定义foowindows地方bar情况
2条回答

不要做s.replace(anything)。只要在字符串文本前面,在开始的引号之前加上一个r,就可以得到一个原始字符串。基于字符串替换的任何东西都是一个可怕的错误,因为s实际上没有反斜杠;您的代码中有反斜杠,但这些不会成为实际字符串中的反斜杠。

如果字符串中确实有反斜杠,并且您希望字符串在曾经有过反斜杠的地方有两个,则需要:

s = s.replace('\\', r'\\')

用两个反斜杠代替任何一个反斜杠。但是,如果字符串在源代码中实际显示为s = 'C:\foo\bar',那么唯一合理的解决方案就是更改该行。它被破坏了,你对代码的其余部分所做的任何事情都不会使它不被破坏。

经过一系列的反复询问,实际的问题是:

您有一个包含以下内容的文件:

C:\foo\bar
C:\spam\eggs

您想读取该文件的内容,并将其用作路径名,还想知道如何转义。

答案是你什么都不用做。

反斜杠序列在字符串文本中处理,而不是在从文件或input(在3.x中;在2.x中,即raw_input)中读取的字符串对象中处理。因此,不需要对这些反斜杠序列进行转义。

如果你仔细想想,你不需要在一个字符串周围加引号就可以把它变成一个字符串。这是完全相同的情况。引号和转义反斜杠都是字符串的表示的一部分,而不是字符串本身。


换句话说,如果将该示例文件保存为paths.txt,并运行以下代码:

with open('paths.txt') as f:
    file_paths = [line.strip() for line in f]
literal_paths = [r'C:\foo\bar', r'C:\spam\eggs']
print(file_paths == literal_paths)

…它会打印出True


当然,如果您的文件生成不正确并且充满了这样的垃圾:

C:♀oar

那就没有办法“逃离反睫毛”,因为它们不是为了逃避。您可以尝试编写启发式代码来重构原始数据,这些数据本来应该存在,但这是您所能做的最好的。

例如,您可以这样做:

backslash_map = { '\a': r'\a', '\b': r'\b', '\f': r'\f', 
                  '\n': r'\n', '\r': r'\r', '\t': r'\t', '\v': r'\v' }
def reconstruct_broken_string(s):
    for key, value in backslash_map.items():
        s = s.replace(key, value)
    return s

但是,如果要撤消任何十六进制、八进制或Unicode转义序列,这将没有帮助。例如,'C:\foo\x02''C:\foo\b'都表示完全相同的字符串,因此如果得到该字符串,就无法知道应该转换为哪个字符串。这就是为什么你能做的最好的事情就是启发。

相关问题 更多 >