我正在尝试使用py2neo从neo4j数据库中检索一些值
query_results = neo4j.CypherQuery(graph_db,"START n=node(*) MATCH (n:Concept) RETURN n.name, ID(n) ORDER BY n.name ASC LIMIT 200").stream()
result = []
for record in query_results:
result.append({'id':record[1],'name':unicode(record[0]).encode("utf-8")})
在大多数情况下,此方法都可以正常工作,但是当我使用n.name(例如“Hand-Schüller-Christianhistiocyte(cell)”)时失败
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 8: ordinal not in range(128)
将错误抛出到“在query_results中记录:”行,并且在py2neo源代码中引发以下错误
File "build/bdist.macosx-10.9-intel/egg/py2neo/neo4j.py", line 1141, in __iter__
yield self._record(*_hydrated(assembled(row)))
File "build/bdist.macosx-10.9-intel/egg/py2neo/neo4j.py", line 178, in _hydrated
return type(data)([_hydrated(datum) for datum in data])
File "build/bdist.macosx-10.9-intel/egg/py2neo/neo4j.py", line 177, in _hydrated
elif is_collection(data):
File "build/bdist.macosx-10.9-intel/egg/py2neo/util.py", line 134, in is_collection
hasattr(None, obj)
我不确定它是否是py2neo错误或做错了什么。任何建议都很好。
谢谢
最佳答案
您的代码在这里失败:
unicode(record[0])
为什么?因为在未指定编码的情况下,
unicode
构造函数期望字符串编码为ascii
。基本上,它期望如下所示:unicode(ascii(record[0]))
现在,我们如何解决这个问题?很简单的!只需将
encoding
参数-在您的情况下为latin-1
-传递给构造函数:unicode(record[0], encoding='latin-1')
看到?
这是一个小演示:
>>> s = "Schüller"
>>> unicode(s, encoding='latin-1')
u'Sch\xfcller'
编辑:
经过更多研究后,我认为是的,这是由查询结果中意外的字节序列或字符集触发的错误。看看this issue。
但是,看起来它已在较新的版本1.6.1中修复。希望这可以帮助!
关于python - 迭代IterableCypherResults时未在py2neo中转换为utf-8,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20285390/