写入然后读取latin1中编码的文件中的字符串

时间:2013-07-22 14:34:47

标签: python io latin1

以下是2个代码示例,Python3:第一个使用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çadansun fichier。”

有什么问题?我也尝试过io.open,但我想念一些东西。有趣的是,我对Python2.7及其str.decode方法没有这样的问题,现在它已经消失......

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

您的数据是以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代替拉丁语-1。

如果您使用如下标题保存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标头在如何解释源代码方面存在分歧。如果您的源代码被正确解码,则正确的输出是:

b'On \\xe9crit \\xe7a dans un fichier.'

如果Spyder顽固地忽略PEP-263标头并将您的源读取为Latin-1 而不管,请避免使用非ASCII字符并改为使用转义码;使用\uxxxx unicode代码点:

s = 'On \u00e9crit \u007aa dans un fichier.'
代码点低于256的

\xaa单字节转义码:

s = 'On \xe9crit \x7aa dans un fichier.'