来来回回问了一堆问题,实际问题是这样的:
您有一个文件,其内容如下:
C:\foo\bar
C:\spam\eggs
您想读取该文件的内容,并将其用作路径名,并且您想知道如何转义。
答案是你根本不需要做任何事情。
反斜杠序列在string literalsinput
中处理,而不是在您从文件或从(在 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'
都表示完全相同的字符串,所以如果你得到那个字符串,就无法知道你应该转换到哪个字符串。这就是为什么你能做的最好的就是启发式。