Python 在用拉丁文1编码的文件中写入然后读取字符串

Python 在用拉丁文1编码的文件中写入然后读取字符串,python,io,latin1,Python,Io,Latin1,这里有两个代码示例,Python3:第一个使用拉丁1编码编写两个文件: 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',encod

这里有两个代码示例,Python3:第一个使用拉丁1编码编写两个文件:

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()
第二个文件以相同的编码读取相同的文件:

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.'
这要么意味着您没有写出拉丁语-1数据,要么您的源代码被保存为UTF-8,但您声明了您的脚本(使用a将其改为拉丁语-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字符,而是使用转义码;或者使用
\uxxx
unicode代码点:

s = 'On \u00e9crit \u007aa dans un fichier.'
\xaa
256以下代码点的单字节转义码:

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

您是否100%确定这些文件是用拉丁语-1编码编写的?这看起来非常像UTF-8数据。
>>“Onécritça dans un fichier.”。encode('utf8')。decode('latin1'))
给出了
'OnécritÃa dans un fichier.
@Coulombeau:如果没有一些标志,我无法帮助你找到自己的路。我给了你一个如何调试的指示。你如何用
s.encode('unicode_escape')的输出更新你的问题
又戳了我一下?好吧,我迷路了!我只按照你的要求编辑了第一个脚本。进行了测试
打印(s.encode('unicode_escape'))
这给了我你引用的第一个错误结果。他们决定添加一个标题(这是我以前没有做过的)然后把
#-*-编码:utf-8-*-
也尝试了ascii或拉丁语。没有任何变化。然后我写了简单的行(我需要理解,让我们非常简单!):
#-*-编码:utf-8-*-s='Onécritça dans un fichier.'打印(s.encode('utf-8')。解码('utf-8'))
这给了我…在©critçadans un fichier上。很抱歉,第一条无用的评论,我错误地发布了它,然后无法编辑它,因为5分钟过去了。然后,您的编辑器将您的源代码保存为拉丁文1。那么,我的发行版有问题吗?我正在使用Windows 7和WinPython3.3(64位).由于我是一名教师,所以我实际上没有选择发行版,这是我正在教学的CPGE(法语系统…)计算机上的发行版。无论如何,我现在正在使用spyder进行编辑。我应该更改或编辑一些配置文件吗?
print(s.encode('utf-8')。decode('utf-8'))的坏结果
我真的无法理解。。。