将python namedtuples写入csv以防止UnicodeDeer错误
我正在使用从neo4j数据库导出数据。(在MacOS X上使用Python 2.7) 以下是我一直使用的代码:将python namedtuples写入csv以防止UnicodeDeer错误,python,csv,py2neo,Python,Csv,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_d
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文件?您正在尝试写入包含(除其他外)代码点的Unicode数据 您需要将您的值编码为UTF-8,或者找到另一种方法将Unicode值表示为数据 可以在生成器表达式中使用列表理解对每列进行编码:
writer.writerows([unicode(c).encode('utf8') for c in row] for row in query.stream())
unicode()
调用确保在尝试编码之前,先将非unicode值转换为unicode字符串
您还可以尝试“简化”值;您发现的代码点是一个“奇特”的引号,可能正是因为文字处理器或桌面电子表格应用程序决定用这些引号替换常规引号。如果您的所有数据都是ASCII文本或数字,那么您可以尝试用ASCII等价物替换“花哨”数据
可以再次使用ASCII版本替换此类代码点:
from unidecode import unidecode
writer.writerows([unidecode(unicode(c)) for c in row] for row in query.stream())
您正在尝试编写包含(除其他外)码点的Unicode数据 您需要将您的值编码为UTF-8,或者找到另一种方法将Unicode值表示为数据 可以在生成器表达式中使用列表理解对每列进行编码:
writer.writerows([unicode(c).encode('utf8') for c in row] for row in query.stream())
unicode()
调用确保在尝试编码之前,先将非unicode值转换为unicode字符串
您还可以尝试“简化”值;您发现的代码点是一个“奇特”的引号,可能正是因为文字处理器或桌面电子表格应用程序决定用这些引号替换常规引号。如果您的所有数据都是ASCII文本或数字,那么您可以尝试用ASCII等价物替换“花哨”数据
可以再次使用ASCII版本替换此类代码点:
from unidecode import unidecode
writer.writerows([unidecode(unicode(c)) for c in row] for row in query.stream())