我正在尝试使用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/

10-12 22:42