【问题标题】:Writing and then reading a string in file encoded in latin1在 latin1 编码的文件中写入然后读取字符串
【发布时间】:2013-07-22 14:34:46
【问题描述】:

这里有 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 ça dans un fichier”。

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

有人可以帮我吗?

【问题讨论】:

  • 您是否 100% 确定文件是使用 Latin-1 编码编写的?这看起来非常像 UTF-8 数据..
  • >>> 'On écrit ça dans un fichier.'.encode('utf8').decode('latin1')'On écrit ça dans un fichier.'

标签: python io latin1


【解决方案1】:

您的数据以 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 改为 Latin-1。

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

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

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

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

也会以同样的方式被 Python 误解。将生成的 unicode 值以 Latin-1 格式保存到磁盘,然后以 Latin-1 格式再次读取它会保留错误。

要调试,请仔细查看 first 脚本中的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.'

\xaa 256 以下代码点的一字节转义码:

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

【讨论】:

  • @Coulombeau:没有地标,我无法帮助你找到自己的路。我给了你一个关于如何调试的指示。您如何使用s.encode('unicode_escape') 的输出更新您的问题并再次戳我?
  • 好吧,我迷路了!我按照您的要求只编辑了第一个脚本。进行了测试print(s.encode('unicode_escape')),这给了我你引用的第一个错误结果。决定添加一个标题(我以前没有这样做过)并输入# -*- coding: utf-8 -*- 或者也尝试了 ascii 或 latin1。没有改变。然后我写了简单的行(我需要理解,让我们把它看得很简单!):# -*- coding: utf-8 -*- s='On écrit ça dans un fichier.' print(s.encode('utf-8').decode('utf-8')) 这给了我...... On écrit çadans un fichier。
  • 对不起第一个无用的评论,我错误地发布了它,然后因为5分钟过去了而无法编辑它
  • 您的编辑器会将您的源代码保存为 Latin1。
  • 好吧,这可能是我的发行版的问题吗?我正在使用带有 WinPython3.3(64 位)的 Windows 7。因为我是一名教师,所以我并没有真正选择分发,这就是我正在教学的 CPGE(法语系统......)计算机上的分发。反正。我现在正在用 spyder 进行编辑。我应该更改还是编辑一些配置文件? print(s.encode('utf-8').decode('utf-8')) 的糟糕结果对我来说真的无法理解......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多