转义Windows路径分隔符

时间:2013-08-02 23:57:00

标签: python windows path escaping

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

我需要这个:

s = 'C:\foo\bar'

是这样的:

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

我在这里和其他地方找到的所有内容都说要做到这一点:

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

(为什么我必须逃避原始字符串中的字符,我无法想象)

但打印字符串会产生这种情况。显然有些东西决定重新解释修改后的字符串中的转义:

C:♀oar

在Perl中这将是如此简单。我如何在Python中解决这个问题?

2 个答案:

答案 0 :(得分:4)

经过一堆问题来回,实际问题是:

您的文件包含以下内容:

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

您想要阅读该文件的内容,并将其用作路径名,并且您想知道如何逃避这些事情。

答案是你根本不需要做任何事情。

反斜杠序列在字符串文字中处理,而不是在从文件读取的字符串对象中处理,或者从input处理(在3.x中;在2.x中{{1}因此,您不需要转义那些反斜杠序列。

如果您考虑一下,则无需在字符串周围添加引号以将其转换为字符串。这是完全相同的情况。引号和转义反斜杠都是字符串的表示的一部分,而不是字符串本身。


换句话说,如果您将该示例文件另存为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

但如果要撤消任何十六进制,八进制或Unicode转义序列,这将无济于事。例如,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 'C:\foo\x02'都表示完全相同的字符串,因此如果您获得该字符串,则无法知道您应该转换为哪个字符串。这就是为什么你能做的最好的是启发式。

答案 1 :(得分:0)

不要s.replace(anything)。只需在开头引号之前将r粘贴在字符串文字前面,这样就有了一个原始字符串。基于字符串替换的任何东西都是一个可怕的kludge,因为s实际上没有反斜杠;你的代码中有反斜杠,但那些代码不会成为实际字符串中的反斜杠。

如果字符串中实际上有反斜杠,并且您希望字符串在曾经有一个的情况下有两个反斜杠,那么您需要这样:

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

这将用两个反斜杠替换任何单个反斜杠。但是,如果字符串字面上在源代码中显示为s = 'C:\foo\bar',那么唯一合理的解决方案是更改该行。它已经坏了,你对其余代码所做的任何事情都不会让它破碎。