【问题标题】:Write python namedtuples to csv to prevent UnicodeEncodeError将python命名元组写入csv以防止UnicodeEncodeError
【发布时间】:2014-08-12 15:04:09
【问题描述】:

我正在使用py2neo 从我的 neo4j 数据库中导出数据。 (在 MacOS X 上使用 Python 2.7)

这是我一直在使用的代码:

import csv
from py2neo import neo4j, cypher, node, rel
import pprint

ofile  = open('mydata.csv', 'wb')
writer = csv.writer(ofile, delimiter='\t', quotechar='|', quoting = csv.QUOTE_ALL)
graph_db = neo4j.GraphDatabaseService("http://xx.xx.xx.xx:7474/db/data/")
qs = '''MATCH (a:MyLabel) 
WHERE NOT a.shortdesc = ""
RETURN a.name, a.shortdesc, a.longdesc 
ORDER BY a.name'''
query = neo4j.CypherQuery(graph_db, qs)
writer.writerows(query.stream())

在属性 a.shortdesc 和 a.longdesc 中显然有一些奇怪的字符,我不知道如何正确编码它们。我收到此错误:

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

我一直在尝试各种不同的东西...如何获取命名元组并正确编码它们以便将它们写入 csv 文件?

【问题讨论】:

    标签: python csv py2neo


    【解决方案1】:

    您正在尝试编写包含(以及其他)U+201C LEFT DOUBLE QUOTATION MARK 代码点的 Unicode 数据。

    您需要将值编码为 UTF-8 或找到另一种方式将 Unicode 值表示为数据。

    可以在生成器表达式中使用列表推导对每一列进行编码:

    writer.writerows([unicode(c).encode('utf8') for c in row] for row in query.stream())
    

    unicode() 调用可确保在尝试编码之前先将非 unicode 值转换为 unicode 字符串。

    您也可以尝试“简化”这些值;您找到的代码点是一个“花哨的”引用,可能只是因为文字处理器或桌面电子表格应用程序决定用这些替换常规引用。如果您的所有数据都只是 ASCII 文本或数字,您可以尝试用 ASCII 等价物替换“花哨”的东西。

    Unidecode package 可以再次将此类代码点替换为 ASCII 版本:

    from unidecode import unidecode
    
    writer.writerows([unidecode(unicode(c)) for c in row] for row in query.stream())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 2013-02-28
      • 1970-01-01
      • 2019-03-10
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多