<p>经过一系列的反复询问,实际的问题是:</p>
<p>您有一个包含以下内容的文件:</p>
<pre><code>C:\foo\bar
C:\spam\eggs
</code></pre>
<p>您想读取该文件的内容,并将其用作路径名,还想知道如何转义。</p>
<p>答案是你什么都不用做。</p>
<p>反斜杠序列在<em>字符串文本</em>中处理,而不是在从文件或<code>input</code>(在3.x中;在2.x中,即<code>raw_input</code>)中读取的字符串对象中处理。因此,不需要对这些反斜杠序列进行转义。</p>
<p>如果你仔细想想,你不需要在一个字符串周围加引号就可以把它变成一个字符串。这是完全相同的情况。引号和转义反斜杠都是字符串的<em>表示</em>的一部分,而不是字符串本身。</p>
<hr/>
<p>换句话说,如果将该示例文件保存为<code>paths.txt</code>,并运行以下代码:</p>
<pre><code>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)
</code></pre>
<p>…它会打印出<code>True</code>。</p>
<hr/>
<p>当然,如果您的文件生成不正确并且充满了这样的垃圾:</p>
<pre><code>C:♀oar
</code></pre>
<p>那就没有办法“逃离反睫毛”,因为它们不是为了逃避。您可以尝试编写启发式代码来重构原始数据,这些数据本来应该存在,但这是您所能做的最好的。</p>
<p>例如,您可以这样做:</p>
<pre><code>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
</code></pre>
<p>但是,如果要撤消任何十六进制、八进制或Unicode转义序列,这将没有帮助。例如,<code>'C:\foo\x02'</code>和<code>'C:\foo\b'</code>都表示完全相同的字符串,因此如果得到该字符串,就无法知道应该转换为哪个字符串。这就是为什么你能做的最好的事情就是启发。</p>