如何在Python中将unicode对象写入文件?

时间:2016-04-25 08:03:34

标签: python unicode decode encode utf

我尝试写一个"字符串"到文件并获取以下错误消息:

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还是别的什么?

ADDED

我想我已经设法将字符串保存到文件中。 print >>f, txt以及print >>f, txt.decode('utf-8')不起作用,但print >>f, txt.encode('utf-8')有效。我没有收到任何错误消息,我在文件中看到了中文字符。

2 个答案:

答案 0 :(得分:3)

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

  

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

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

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

如果不知道txt对象中的内容,我可以更具体。

答案 1 :(得分: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个字符)这个字符的字节数)。