转义 Windows 的路径分隔符

use*_*567 0 python windows escaping path

我需要通过转义 Windows 路径分隔符来更改此字符串。我自己没有定义原始字符串,所以我不能在原始字符串“r”前面添加。

\n\n

我需要这个:

\n\n
s = 'C:\\foo\\bar'\n
Run Code Online (Sandbox Code Playgroud)\n\n

是这样的:

\n\n
s = 'C:\\\\foo\\\\bar'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
s.replace( r'\\\\', r'\\\\\\\\' )\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
C:\xe2\x99\x80oar\n
Run Code Online (Sandbox Code Playgroud)\n\n

这在 Perl 中是非常简单的。我如何在Python中解决这个问题?

\n

aba*_*ert 5

经过一系列的来回询问,实际问题是这样的:

\n\n

您有一个内容如下的文件:

\n\n
C:\\foo\\bar\nC:\\spam\\eggs\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

答案是您根本不必执行任何操作。

\n\n

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

\n\n

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

\n\n
\n\n

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

\n\n
with open(\'paths.txt\') as f:\n    file_paths = [line.strip() for line in f]\nliteral_paths = [r\'C:\\foo\\bar\', r\'C:\\spam\\eggs\']\nprint(file_paths == literal_paths)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 它将打印出True.

\n\n
\n\n

当然,如果您的文件生成不正确并且充满垃圾,如下所示:

\n\n
C:\xe2\x99\x80oar\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么就没有办法“转义反斜杠”,因为它们不是用来转义的。您可以尝试编写启发式代码来重建应该存在的原始数据,但这是您能做的最好的事情。

\n\n

例如,你可以这样做:

\n\n
backslash_map = { \'\\a\': r\'\\a\', \'\\b\': r\'\\b\', \'\\f\': r\'\\f\', \n                  \'\\n\': r\'\\n\', \'\\r\': r\'\\r\', \'\\t\': r\'\\t\', \'\\v\': r\'\\v\' }\ndef reconstruct_broken_string(s):\n    for key, value in backslash_map.items():\n        s = s.replace(key, value)\n    return s\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n