python - mongodb python 导入 csv
问题描述
我正在尝试将 csv 导入 Mongodb,然后从 Mongodb 执行命令以获取数据。
这是我的代码。
import pandas as pd
from pymongo import MongoClient
client = MongoClient()
db = client.test # client.database_name
collection = db.test #db.collection_name
def csv_to_json(filename, header=None):
data = pd.read_csv(filename, header=header)
return data.to_dict('records')
collection.insert_many(csv_to_json('test.csv'))
但是,我有这个错误。究竟出了什么问题?
operation, command, docs, check_keys, ack, opts, ctx)
InvalidDocument: documents must have only string keys, key was 0
解决方案
默认情况下read_csv()
,将从零开始索引数据框的行和列。然后该to_dict()
方法将创建一个具有数字键的字典列表。MongoDB 中不允许使用数字键;因此你看到的问题。
因此,假设您的 csv 文件如下所示:
Field1,Field2
a,x
b,y
c,z
那么你需要做的唯一改变是:
collection.insert_many(csv_to_json('test.csv', header=0))
这将告诉 pandas 基于标题行创建一个索引,然后该索引将成为文档中每个字段的键。
pprint.pprint(list(collection.find({}, {'_id': 0})))
给出:
[{'Field1': 'a', 'Field2': 'x'},
{'Field1': 'b', 'Field2': 'y'},
{'Field1': 'c', 'Field2': 'z'}]
推荐阅读
- r - How do I calculate two separate means for a vector with both characters and numbers?
- python - Calling python multiprocessing map function with a dictionary
- vue.js - How to prevent a submit button on a form to be clicked multiple times in VUEJS
- c++ - C++ 在填充数组时遇到问题
- javascript - discord.js detect multiple channel deletes and multiple bans
- python - 为什么不应用 pandas join-on-join 后缀
- arrays - Julia 截断数组数组的内部维度
- python - Jupyter QtConsole 在哪里保存它过去的命令
- python-3.x - Odoo 12:AttributeError:“int”对象没有属性“get”
- java - Gradle 无法使用 lombok 构建