Python-unicode问题

2024-06-15 05:33:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我从ZODB(Zope对象数据库)接收一些数据。我收到一个mybrains对象。然后我会:

o = mybrains.getObject()

我在我的项目中收到一个“Person”对象。那么,我可以

^{pr2}$

在我的课上做print b我得到:

José Carlos

print b.name.__class__

<type 'unicode'>

我有很多“人”的东西。它们被添加到列表中。在

names = [o.nome, o1.nome, o2.nome]

然后,我试图用这些数据创建一个文本文件。在

delimiter = ';'
all = delimiter.join(names) + '\n'

没问题。现在,当我做一个print all时,我有:

José Carlos;Jonas;Natália
Juan;John

但当我试图创建一个文件时:

f = open("/tmp/test.txt", "w")
f.write(all)

我遇到了这样一个错误(位置不一样,因为我更改了名称)

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

如果我已经可以用“正确”的表单打印出来显示它,为什么我不能用它来写文件呢?我应该使用哪种编码/解码方法来编写包含此数据的文件?在

我使用的是python2.4.5(无法升级)


Tags: 文件数据对象in数据库zopenamesall
2条回答

UnicodeEncodeError: 'ascii' codec

write正在尝试使用ascii编解码器对字符串进行编码(它没有编码重音字符的方式,比如é或á)。在

而是使用

import codecs
with codecs.open("/tmp/test.txt",'w',encoding='utf-8') as f:   
    f.write(all.decode('utf-8'))

或者选择其他编解码器(如cp1252)来对字符串中的字符进行编码。在

上面使用了PS.all.decode('utf-8'),因为f.write需要一个unicode字符串。Better than usingall.decode('utf-8')将尽早将所有字符串转换为unicode,在unicode中工作,并在必要时才将其编码为特定的编码,如'utf-8'。在

PPS。看起来names可能已经是unicode字符串的列表。在这种情况下,将delimiter也定义为unicode字符串:delimiter = u';',因此{}将是unicode字符串。那么

^{pr2}$

应该可以工作(除非Python2.4有一些我不知道的问题。)

如果“utf-8”不起作用,请记住尝试其他包含您所需字符的编码,并且您的计算机知道这些字符。在Windows上,这可能意味着“cp1252”。在

您告诉Python打印all,但是由于all没有固定的计算机表示,Python首先必须将all转换为某种可打印的形式。因为您没有告诉Python如何进行转换,所以它假设您需要ASCII。不幸的是,ASCII只能处理0到127之间的值,all包含超出该范围的值,因此您会看到一个错误。在

要修复此用法:

all = "José Carlos;Jonas;Natália Juan;John"
import codecs
f = codecs.open("/tmp/test.txt", "w", "utf-8")
f.write(all.decode("utf-8"))
f.close()

相关问题 更多 >