这是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/