【问题标题】:How to get Python 3 to correctly handle unicode strings from MongoDB?如何让 Python 3 正确处理来自 MongoDB 的 unicode 字符串?
【发布时间】:2014-11-11 22:36:32
【问题描述】:

我使用的是 Windows 7 64 位、Python 3、MongoDB 和 PyMongo。我知道在 Python 3 中,所有字符串都是 unicode。我也知道 MongoDB 将所有字符串存储为 unicode。所以我不明白为什么,当我从数据库中提取特定字段的值为“C:\Some Folder\E=mc².xyz”的文档时,Python 将该字符串视为“C:\Some Folder\ E=mc².xyz”。它不只是那样打印; os.path.exists() 返回 False。现在,好像这还不够令人困惑,如果我将字符串保存到一个文本文件中,然后使用显式设置为“utf-8”的编码打开它,字符串就会正确显示,并且 os.path.exists()返回真。出了什么问题,我该如何解决?

编辑: 这是我刚刚编写的一些代码来演示我的问题:

from pymongo import MongoClient

db = MongoClient().test_db
orig_doc = {'string': 'E=mc²'}
_id = db.test_col.insert(orig_doc)
new_doc = db.test_col.find_one(_id)
print(new_doc['string'])

>>> E=mc²

如您所见,它完全可以正常工作!因此,我现在意识到,当我从 PostgreSQL 迁移时,我一定搞砸了。现在我只需要修复字符串。我知道这是可能的,但必须有比将字符串写入文本文件然后再读回更好的方法。我可以这样做,就像我在之前的测试中所做的那样,但这似乎不是正确的方法。

【问题讨论】:

  • 你能包含一些代码吗?您似乎缺少指定编码的设置或调用。似乎没有什么问题,您只是以不正确的编码获取数据。

标签: mongodb python-3.x unicode pymongo


【解决方案1】:

您不能存储 Unicode。这是一个概念。 MongoDB 必须使用 Unicode 编码,它看起来像 UTF-8。 Python 3 Unicode 字符串在内部存储为多种编码之一,具体取决于字符串的内容。你所拥有的是一个用错误编码解码为 Unicode 的字符串:

>>> s='"C:\Some Folder\E=mc².xyz"'  # The invalid decoding.
>>> print(s)
"C:\Some Folder\E=mc².xyz"
>>> print(s.encode('latin1').decode('utf8'))  # Undo the wrong decoding, and apply the right one.
"C:\Some Folder\E=mc².xyz"

没有足够的信息告诉您如何正确阅读 MondoDB,但这应该对您有所帮助。

【讨论】:

  • 您的回复是在我编辑完帖子之前收到的。我刚刚测试了您的解决方案,它有效!非常感谢!
猜你喜欢
  • 2011-06-11
  • 2016-10-31
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2011-04-14
  • 2017-11-19
  • 2011-06-19
  • 2014-03-16
相关资源
最近更新 更多