Python CSV 编码

3
我正在编写一个小脚本,可以将我的Facebook联系人的电子邮件地址导入到GMail/Android。我的输入文件包含Unicode字符,例如:Jasmin L\u00f3pez。生成的CSV输出文件如下所示:

André Zzz,,,,,,,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * My Contacts,* Home,zzz@yahoo.com
Andréia Ggg,,,,,,,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * My Contacts,* Home,ggg@hotmail.com
Andrés Bbb,,,,,,,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * My Contacts,* Home,bbb@gmail.com

正如您所看到的,我在编码方面遇到了问题。我正在创建Google联系人CSV文件,但需要正确显示名称。我使用此函数来编写CSV:
def writecsv(self):
    if self.outfile is not '':
        #fh = open(self.outfile, 'wb')
        #fh = codecs.open(self.outfile, "wb", "utf-8")
        fh = codecs.open(self.outfile, 'wb', encoding="latin-1")
    else:
        fh = sys.stdout

    csvhdlr = csv.writer(fh, quotechar='"', quoting=csv.QUOTE_MINIMAL)
    csvhdlr.writerow("Name,Given Name,Additional Name,Family Name,Yomi Name,Given Name Yomi,Additional Name Yomi,Family Name Yomi,Name Prefix,Name Suffix,Initials,Nickname,Short Name,Maiden Name,Birthday,Gender,Location,Billing Information,Directory Server,Mileage,Occupation,Hobby,Sensitivity,Priority,Subject,Notes,Group Membership,E-mail 1 - Type,E-mail 1 - Value".split(','))        
    for contact in self.clist:
        #csvhdlr.writerow(dict((vname, vtype, vnotes, vstereotype, vauthor, valias, vgenfile.encode('utf-8')) for vname, vtype, vnotes, vstereotype, vauthor, valias, vgenfile in row.iteritems()))
        row = contact.fullname + ',,,,,,,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * My Contacts,* Home,' + contact.email
        csvhdlr.writerow(row.split(','))

任何想法吗?我很新手,每次使用编码时,它都不能按照我希望的工作 =(
非常感谢你的帮助!
1个回答

3

如果我理解得正确,您的文件不包含高Unicode字符;它只包含Unicode转义序列,如 "\u00f3",表示高Unicode字符。如果您的文件实际包含字符串 "Jasmin L\u00f3pez"(带有文字反斜线和 u),则需要在写入之前将其解码为实际的Unicode字符。请查看 unicode_escape 编解码器。

>>> x = b"\u00f3"
>>> print x
\u00f3
>>> print x.decode('unicode_escape')
ó

谢谢您的快速回复,它在控制台上运行得很好,但是当我尝试写入csv时,出现了这个错误:UnicodeEncodeError:'ascii'编解码器无法对位置3中的字符u'\xe3'进行编码:超出范围(128)。有什么线索吗? - Albert Vonpupp
你是如何解决这个问题的? - Maurício Szabo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接