【问题标题】:How to write a unicode object into a file in Python?如何将 unicode 对象写入 Python 中的文件?
【发布时间】:2016-08-18 12:20:42
【问题描述】:

我尝试将“字符串”写入文件并收到以下错误消息:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xcd' in position 6: ordinal not in range(128)

我尝试了以下方法:

print >>f, txt
print >>f, txt.decode('utf-8')
print >>f, txt.encode('utf-8')

它们都不起作用。我有同样的错误信息。

编码和解码背后的想法是什么?如果我有一个 unicode 对象,我可以直接将其写入文件还是需要将其转换为字符串?

我怎样才能知道使用了什么编码?我怎么知道它是 utf-8 还是 ascii 或其他什么?

添加

我想我刚刚设法将一个字符串保存到一个文件中。 print >>f, txtprint >>f, txt.decode('utf-8') 不起作用,但 print >>f, txt.encode('utf-8') 起作用。我没有收到错误消息,并且在我的文件中看到了中文字符。

【问题讨论】:

  • 那个字符串是什么?
  • @EbraHim,我猜它是一个 unicode 对象,因为我通过以下方式读取字符串获得了字符串:for line in io.open(fname, encoding="utf8"):
  • @Roman for line in io.open(fname, encoding="utf8"): 将编码改为utf-8
  • 您的问题在这里得到解答:stackoverflow.com/questions/6048085/…
  • 文件包含字节。 Unicode 字符串由代码点组成。您需要将它们转换为字节,有很多方法可以做到这一点,这称为编码。

标签: python unicode decode encode utf


【解决方案1】:

我认为你需要使用编解码器库:

import codecs

file = codecs.open("test.txt", "w", "utf-8")
file.write(u'\xcd')
file.close()

工作正常。

编码/解码的故事:

过去,计算机中只有大约 60 个字符可用(包括大小写字母 + 数字 + 一些特殊字符)。所以只有 1 个字节就足以为每个字母分配一个唯一的编号。将数字分配给字母以存储在内存中称为编码。默认情况下,python 中使用的这种单字节编码命名为ASCII

随着世界上计算机的发展,我们需要在计算机中拥有更多的字母和字符。所以 1 个字节是不够的。出现了不同的编码方案。 Unicode 是著名的之一。您尝试存储在文件中的字符是 Unicode 字符,它需要 2 个字节,因此您必须向 Python 明确指出您不想使用默认编码,即 ASCII(因为您需要 2 个字节这个角色)。

【讨论】:

    【解决方案2】:

    我最近发布了another answer 来解决这个问题。关键引用:

    为了更好地了解差异,请阅读one of Joel's articles,但要点是字节是字节(8 位的组,没有附加任何附加含义),而字符是组成文本字符串的东西. 编码将字符转换为字节,解码将字节转换回字符。

    在 Python 2 中,unicode 对象是字符串。常规str 对象可以是字符串或字节字符串。 (专业提示:使用 Python 3,它使跟踪更容易。)

    您应该将 字符 字符串(不是字节字符串)传递给 print,但您需要确保这些字符串可以由编解码器(例如 ASCII 或 UTF- 8) 与目标文件对象f 关联。作为输出过程的一部分,Python 会为您编码字符串。如果字符串包含文件对象的编解码器无法编码的字符,您将收到与您所看到的类似的错误。

    如果不知道您的 txt 对象中有什么,我无法更具体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      相关资源
      最近更新 更多