在用拉丁语1编码的文件中写入并读取字符串



这里有两个代码示例,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ça dans 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的头改为Latin-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.'

最新更新