【问题标题】:Not converting to utf-8 in py2neo while iterating IterableCypherResults迭代 IterableCypherResults 时未在 py2neo 中转换为 utf-8
【发布时间】:2013-11-29 12:04:29
【问题描述】:

我正在尝试使用 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 histiocyte (cell)”这样的 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 错误还是做错了什么。任何建议都会很棒。

谢谢

【问题讨论】:

    标签: python py2neo


    【解决方案1】:

    您的代码在这里失败:

    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 中得到修复。希望这会有所帮助!

    【讨论】:

    • 实际上它在这一步中失败了“记录在query_results:”中。我认为 py2neo 中 IterableCypherResults 的可迭代方法中可能存在错误。到目前为止,我找不到解决方法
    • 不,不。当您尝试将非 ascii 字符串转换为 unicode 时!错误是UnicodeEncodeError,对吧? :)
    • 是的。但是即使我评论部分“ result.append({'id':record[1],'name':unicode(record[0]).encode("utf-8")})” 我也会收到错误消息。
    • 更新了我的答案,对此感到抱歉
    • 更新 py2neo 有帮助。谢谢 :) 我使用的是 1.6.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2015-01-14
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多