在latin1编码的文件中写入并读取字符串

2024-04-29 10:57:00 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是两个代码示例,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方法没有这样的问题,它现在已经不存在了。。。

有人能帮我吗?


Tags: 文件txt编码onaswithisoopen
1条回答
网友
1楼 · 发布于 2024-04-29 10:57:00

您的数据被写为UTF-8:

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

这意味着您没有写出拉丁语-1数据,或者您的源代码被保存为UTF-8,但是您声明了您的脚本(使用PEP 263-compliant header来代替拉丁语-1)。

如果您保存的Python脚本的标题如下:

# -*- coding: latin-1 -*-

但是文本编辑器用UTF-8编码保存了文件,然后是字符串文字:

s='On écrit ça dans un fichier.'

也会被Python以同样的方式曲解。将得到的unicode值保存为拉丁-1并将其再次读取为拉丁-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头并将源代码读取为拉丁文-1而不管,请避免使用非ASCII字符并改用转义码;或者使用\uxxxxunicode代码点:

s = 'On \u00e9crit \u007aa dans un fichier.'

\xaa256以下代码点的单字节转义码:

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

相关问题 更多 >