这是Python3的2个代码示例:第一个使用latin1编码写入两个文件:

s='On écrit ça dans un fichier.'
with open('spam1.txt', 'w',encoding='ISO-8859-1') as f:
    print(s, file=f)
with open('spam2.txt', 'w',encoding='ISO-8859-1') as f:
    f.write(s)

第二个读取具有相同编码的相同文件:
with open('spam1.txt', 'r',encoding='ISO-8859-1') as f:
    s1=f.read()
with open('spam2.txt', 'r',encoding='ISO-8859-1') as f:
    s2=f.read()

现在,打印s1和s2我得到
On écrit ça dans un fichier.

而不是最初的“Onécritçadans un fichier”。

怎么了 ?我也尝试了io.open,但我错过了一些东西。有趣的是,我对Python2.7及其str.decode方法没有任何问题,该方法现已消失...

有人可以帮我吗?

最佳答案

您的数据被写为UTF-8:

>>> 'On écrit ça dans un fichier.'.encode('utf8').decode('latin1')
'On écrit ça dans un fichier.'

这意味着您没有写出Latin-1数据,或者您的源代码已另存为UTF-8,但是您声明了脚本(使用PEP 263-compliant header改为Latin-1。

如果您使用以下 header 保存Python脚本:
# -*- coding: latin-1 -*-

但是您的文本编辑器而是使用UTF-8编码保存了文件,然后使用字符串文字:
s='On écrit ça dans un fichier.'

同样也会被Python误解。将所得的unicode值以Latin-1的形式保存到磁盘,然后以Latin-1的形式再次读取将保留该错误。

要进行调试,请仔细阅读第一个脚本中的print(s.encode('unicode_escape'))。如果看起来像:
b'On \\xc3\\xa9crit \\xc3\\xa7a dans un fichier.'

那么您的源代码编码和PEP-263 header 在应如何解释源代码上存在分歧。如果您的源代码已正确解码,则正确的输出为:
b'On \\xe9crit \\xe7a dans un fichier.'

如果Spyder固执地忽略了PEP-263 header ,而无论您将源代码读取为Latin-1,都应避免使用非ASCII字符,而应使用转义码;使用\uxxxx Unicode代码点:
s = 'On \u00e9crit \u007aa dans un fichier.'

\xaa一字节转义码,用于低于256的代码点:
s = 'On \xe9crit \x7aa dans un fichier.'

关于python - 写入然后读取以latin1编码的文件中的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17790303/

10-09 05:53