如何遍历目录中的JSON文件并上传到mongodb

时间:2019-05-01 07:26:27

标签: python python-3.x database mongodb pymongo

所以我有一个包含约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文件。 如何解决此问题以上传所有文件?

1 个答案:

答案 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