【问题标题】:UnicodeEncodeError: bulbs and neo4j create ModelUnicodeEncodeError:灯泡和 neo4j 创建模型
【发布时间】:2013-11-06 23:20:59
【问题描述】:

当数据包含非 ascii 数据时,我在尝试通过 Bulbs 将数据添加到 Neo4J 时遇到 Unicode 错误。

以下代码失败:

from bulbs.model import Node
from bulbs.property import String
from bulbs.neo4jserver import Graph

class User(Node):
    element_type="user"
    name = String(nullable=False)

g = Graph()
g.add_proxy("users", User)

user_data = {u'name': u'Aname M\xf6ller'}

g.users.create(**user_data)

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

错误发生在bulbs.utils.u 函数中,通过codecs.unicode_escape_decode()

一些希望相关的信息:

$>python -V
'2.7.3'

>>>type(user_data['name'])
type('unicode')

>>>import bulbs
>>>bulbs.__version__
'0.3'

Neo4J 文档state 将所有 String 对象保存为 unicode,那么为什么我的 unicode 数据不被接受?我希望我只是错过了一些愚蠢的事情。

【问题讨论】:

  • \xf6ö 的 latin-1,对吗?
  • @Paulo Bu。用变音符号纠正 o。虽然我怀疑是导致错误的特定字符。
  • 我怀疑是ascii 编码,试试这个:user_data = {u'name': u'Aname M\u00f6ller'} 它可能不起作用,但只是为了确定。

标签: python unicode neo4j bulbs


【解决方案1】:

是的,这是一个错误。它已在 Bulbs 0.3.23 中修复:

https://github.com/espeed/bulbs/commit/7f104cdbc30f27ea76b036cfa0d0a694f074153e

【讨论】:

  • @SunPowered:您应该更改您的代码和接受的答案以符合此修复。
  • 太棒了!开源在行动
【解决方案2】:

在使用 Python 和 unicode 刷新自己之后,我解决了这个问题,尽管我只是通过 try、catch 包装我的问题行,然后将问题数据编码为“utf-8”。不是最优雅的解决方案,但以下代码似乎对我有用。

from bulbs.model import Node
from bulbs.property import String
from bulbs.neo4jserver import Graph

class User(Node):
    element_type="user"
    name = String(nullable=False)

g = Graph()
g.add_proxy("users", User)

user_data = {u'name': u'Aname M\xf6ller'}

try:
    g.users.create(**user_data)
except UnicodeEncodeError:
    for k, v in user_data.iteritems():
        try:
            user_data[k] = unicode.encode(v, 'utf-8')
        except TypeError:
            # Fails for non string values
            pass
    g.users.create(**user_data)

我对此的唯一问题。如果bulbs 记录器处于活动状态,则在第一次调用create() 时会记录带有回溯的错误消息。不是破坏交易,只是有点烦人。

还没有在 Python 3 上尝试过,有人对此有意见吗?

【讨论】:

  • 我怀疑bulbs.utils 的函数u 处理编码不当。我在他们位于 github 的仓库中填写了 issue。让我们来看看。这不是将 api 用于此类常见功能 (i18n) 的自然方式。
  • 我同意这可能是bulbs 中的一个错误,使用上述codecs.unicode_escape_decode,正如您在Github 问题中指出的那样,python 文档中根本没有记录。感谢@PauloBu 的帮助
  • 是的,这是一个错误。它已在 Bulbs 0.3.23 github.com/espeed/bulbs/commit/… 中修复,谢谢。
猜你喜欢
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多