Как перебрать JSON-файлы в каталоге и загрузить на mongodb - PullRequest
0 голосов

Итак, у меня есть папка с 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. Я пробовал несколько вариантов кода, но по какой-то причине питон не принимает файлы json. Проблема с этими файлами заключается в том, что python допускает только файлы JSON, разделенные запятыми. Как я могу это исправить, чтобы загрузить все файлы?

1 Ответ

0 голосов
/ 01 мая 2019

Вы вставляете имена файлов в монго. Не содержимое файла.

Предполагается, что у вас есть несколько файлов 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

...