python - 迭代 IterableCypherResults 时未在 py2neo 中转换为 utf-8

标签 python py2neo

我正在尝试使用 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")})

这在大多数情况下都可以正常工作,但当我有一个像“Hand-Schüller-Christian histitherapy(细胞)”这样的 n.name 时就会失败

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

在“for record in 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/

相关文章:

python - 无法检查数组内的任何项目是否也在另一个数据框中

python - 如何使用 datetime.time 在 Python 中绘图

python - 更新了 Numpy 索引中的 Python 星标表达式错误

Neo4j 如何在 Cypher 语句中处理像“\”这样的特殊字符

python - 用户表中的外键已保存但立即回滚

python - 如何配置 uwsgi 将日志记录编码为 json,应用程序输出除外

python - 无法在浏览器中使用 cypher 查询查看我使用 py2neo 创建的节点

neo4j - 我的 Cypher 语句是 'overdone'

python - 无法在 COALESCE pypher 中设置列​​表类型值