<p>文件中没有双反斜杠。当您查看<code>bytes</code>对象的<code>repr</code>时,它显示所有转义的反斜杠,以避免混淆,例如<code>\n</code>(换行符)和{<cd4>}(一个反斜杠后跟一个<code>n</code>)。在</p>
<p>例如:</p>
<pre><code>>>> s = rb'\x84'
>>> s
b'\\x84'
>>> s[0]
92
>>> chr(s[0])
'\\'
</code></pre>
<p>所以,你问的问题不存在。文件中只有一个反斜杠。在</p>
<hr/>
<p>实际的问题是,您不需要四个字节的反斜杠x、8和4,而需要单字节<code>b'\x84'</code>,即<code>chr(0x84)</code>。但是这四个字节是你文件中的。在</p>
<p>所以你的bug存在于你用来创建这个文件的任何代码中。不知何故,不是将字节转储到文件中,而是转储了这些字节的反斜杠转义字符串表示形式。修复它的正确位置是在创建文件的代码中。不写损坏的数据总比写损坏的数据好,然后设法找出如何清除它。在</p>
<p>但是如果为时已晚——例如,如果你用那破代码加密了一堆你不再有权访问的明文,现在你需要尝试恢复它,那么这个转换正好是可逆的。你只需要分两步来完成。在</p>
<hr/>
<p>首先,使用反斜杠转义或更通用的unicode转义编解码器解码字节:</p>
^{pr2}$
<p>然后,您可以显式地将每个Unicode字符转换为与相同数字匹配的字节:</p>
<pre><code>>>> bytes(map(ord, s.decode('unicode-escape')))
b'[w\x84\x7f@\xc6\xab\xc8'
</code></pre>
<p>…或者,有点老调重弹地依赖Python对拉丁语-1的解释:<sup>1</sup></p>
<pre><code>>>> s.decode('unicode-escape').encode('latin-1')
b'[w\x84\x7f@\xc6\xab\xc8'
</code></pre>
<p>同样,这些反斜杠实际上并不在字符串中,这正是Python表示<code>bytes</code>的方式。例如,如果把它放在<code>b</code>中,<code>hex(b[2])</code>是<code>0x84</code>字节<code>\x84</code>,而不是反斜杠字符的<code>0x5c</code>。在</p>
<hr/>
<p>你的创建代码才是真正的问题:</p>
<pre><code>with open(file,'a') as f:
f.write(str(encrypt_text).split("b'")[1].split("'")[0])
f.close()
</code></pre>
<p>将字节转换为字符串表示形式,前缀为<code>b</code>,前后加引号,每个不能打印的字节都用反斜杠转义,然后去掉<code>b</code>和引号,然后通过将其写入文本模式文件将整个内容编码为UTF-8。在</p>
<p>您只需以二进制模式打开文件并将字节写入其中:</p>
<pre><code>with open(file, 'ab') as f:
f.write(encrypt_text)
</code></pre>
<p>(另外,您不想调用<code>f.close()</code>;<code>with</code>语句已经处理好了。)</p>
<p>然后您可以以二进制模式读取文件,并按原样对字节进行解密。在</p>
<p>(或者,如果您真的希望文件是人工可编辑的或其他的,那么您希望选择一种设计为可人工编辑且易于恢复的格式,例如<code>hexlify</code>或{<cd19>},而不是“Python如何表示<code>bytes</code>用于调试的对象”。)</p>
<hr/>
<p><sup>1。对于拉丁语-1中的所有字符,Unicode保证与Latin-1对齐。Python解释这意味着拉丁语-1应该将0-255之间的每个字节编码为0-255,而不仅仅是ISO-8859-1中实际定义的那些。这是有效的,因为ISO-8859-1没有说明如何处理它没有定义的字节,但并不是每个工具都会同意Python。</sup></p>