gpt4 book ai didi

python - 使用 Pymongo 插入文档 - InvalidDocument : Cannot encode object

转载 作者:IT老高 更新时间:2023-10-28 13:20:29 25 4
gpt4 key购买 nike

我正在尝试使用 PyMongo 将文档(在本例中为 Twitter 信息)插入到 Mongo 数据库中。

如下所示,tweets_listdt[0] 与

完全相同
{
'created_at': u'Sun Aug 03 17:07:24 +0000 2014',
'id': 2704548373,
'name': u'NoSQL',
'text': u'RT @BigdataITJobs: Data Scientist \u2013 Machine learning, Python, Pandas, Statistics @adam_rab in London, United Kingdom http://t.co/pIIJVPCuN8\u2026'
}

但我无法将 tweets_listdt[0] 保存到我的 Mongodb 中,而我可以使用后者保存。

In[529]: tweets_listdt[0] == {'created_at': u'Sun Aug 03 17:07:24 +0000 2014',
'id': 2704548373,
'name': u'NoSQL',
'text': u'RT @BigdataITJobs: Data Scientist \u2013 Machine learning, Python, Pandas, Statistics @adam_rab in London, United Kingdom http://t.co/pIIJVPCuN8\u2026'}
Out[528]: **True**

这个失败了:

In[530]: tweetsdb.save(tweets_listdt[0])
tweetsdb.save({'created_at': u'Sun Aug 03 17:07:24 +0000 2014',
'id': 2704548373,
'name': u'NoSQL',
'text': u'RT @BigdataITJobs: Data Scientist \u2013 Machine learning, Python, Pandas, Statistics @adam_rab in London, United Kingdom http://t.co/pIIJVPCuN8\u2026'})
Traceback (most recent call last):
File "D:\Program Files\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3035, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-529-b1b81c04d5ad>", line 1, in <module>
tweetsdb.save(tweets_listdt[0])
File "D:\Program Files\Anaconda\lib\site-packages\pymongo\collection.py", line 1903, in save
check_keys, manipulate, write_concern)
File "D:\Program Files\Anaconda\lib\site-packages\pymongo\collection.py", line 430, in _insert
gen(), check_keys, self.codec_options, sock_info)
InvalidDocument: **Cannot encode object: 2704548373**

这个没问题:

In[531]: tweetsdb.save({'created_at': u'Sun Aug 03 17:07:24 +0000 2014',
'id': 2704548373,
'name': u'NoSQL',
'text': u'RT @BigdataITJobs: Data Scientist \u2013 Machine learning, Python, Pandas, Statistics @adam_rab in London, United Kingdom http://t.co/pIIJVPCuN8\u2026'})
Out[530]: **ObjectId('554b38d5c3d89c09688b1149')**

5 月 10 日更新

谢谢伯尼。我使用的 PyMongo 版本是 3.0.1。

这里是id的数据类型检查:

In[36]:type(tweets_listdt[0]['id'])
Out[37]:long

如果我只是使用:

for tweet in tweets_listdt:
tweetsdb.save(tweet)

会发生上述错误。

但如果我在这行加上,一切都好:

tweet['id'] = int(tweet['id'])

而当我直接赋值时

tweets_listdtw = {'created_at': u'Sun Aug 03 17:07:24 +0000 2014',
'id': 2704548373,
'name': u'NoSQL',
'text': u'RT @BigdataITJobs: Data Scientist'}

tweetsdb.save(tweets_listdtw) 正在工作,并且

print type(tweets_listdtw['id'])
<type 'numpy.int64'>

又搞糊涂了...所以肯定 long 类型是可以的...但是为什么在我将 'id' 更改为 int 之后,保存工作?

最佳答案

您的问题是 numpy.int64 对 MongoDB 来说是陌生的。我曾经也有过一样的问题。

解决方案是将违规值转换为 MongoDB 可以理解的数据类型,以下是我如何在代码中转换这些违规值的示例:

try:
collection.insert(r)
except pymongo.errors.InvalidDocument:
# Python 2.7.10 on Windows and Pymongo are not forgiving
# If you have foreign data types you have to convert them
n = {}
for k, v in r.items():
if isinstance(k, unicode):
for i in ['utf-8', 'iso-8859-1']:
try:
k = k.encode(i)
except (UnicodeEncodeError, UnicodeDecodeError):
continue
if isinstance(v, np.int64):
self.info("k is %s , v is %s" % (k, v))
v = int(v)
self.info("V is %s" % v)
if isinstance(v, unicode):
for i in ['utf-8', 'iso-8859-1']:
try:
v = v.encode(i)
except (UnicodeEncodeError, UnicodeDecodeError):
continue

n[k] = v

collection.insert(n)

我希望这对你有帮助。

关于python - 使用 Pymongo 插入文档 - InvalidDocument : Cannot encode object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30098263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com