所以我有一个包含约500个JSON文件的文件夹。我需要将所有这些都上传到本地mongodb数据库。我尝试使用Mongo Compass,但是Compass一次只能上传一个文件。在python中,我尝试编写一些简单的代码来遍历该文件夹,然后将它们一个接一个地上传,但是遇到了一些问题。首先,JSON文件不是逗号分隔的,而是行分隔的。因此文件看起来像:
{ some JSON object }
{ some JSON object }
...
我编写了以下代码以遍历文件夹并上传:
import pymongo
import json
import pandas as pd
import numpy as np
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient['Test']
mycol = mydb['data']
directory = os.fsencode("C:/Users/PB/Desktop/test/")
for file in os.listdir(directory):
filename = os.fsdecode(file)
if filename.endswith(".json"):
mycol.insert_many(filename)
代码基本上经过一个文件夹,检查它是否是.json文件,然后将其插入数据库。那是应该发生的。但是,出现此错误:
TypeError:文档必须是dict,bson.son.SON的实例, bson.raw_bson.RawBSONDocument,或从其继承的类型 collections.MutableMapping
我似乎无法通过python上传它。我尝试了代码的多种变体,但由于某种原因,python不接受json文件。 这些文件的问题似乎是python只允许使用逗号分隔的JSON文件。 如何解决此问题以上传所有文件?
答案 0 :(得分:0)
您正在将文件名插入mongo。不是文件的内容。
假设您在一个目录中有多个json文件,其中每个文件在每一行中都包含一个json对象...
您需要浏览所有文件,过滤它们,打开它们,逐行阅读它们,将每一行解析为字典,然后插入。如下所示:
os.chdir(directory)
for file in os.listdir(directory):
if file.endswith(".json"):
with open(file) as f:
for line in f:
mongo_obj = json.loads(line)
mycol.insert(mongo_obj)
我首先做了chdir
,以避免必须将整个路径传递给open