Python 在用拉丁文1编码的文件中写入然后读取字符串
这里有两个代码示例,Python3:第一个使用拉丁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
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'))的坏结果
我真的无法理解。。。