Python JSON从ZIP文件导入MongoDB

时间:2017-10-25 12:13:19

标签: python json mongodb

我有一个脚本从文件夹中获取所有.zip文件,然后逐个打开zip文件,在里面加载JSON文件的内容并将其导入MongoDB。

我得到的错误是the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'

代码是:

import json
import logging
import logging.handlers
import os
from logging.config import fileConfig
from pymongo import MongoClient


def import_json():
    try:
        client = MongoClient('5.57.62.97', 27017)
        db = client['vuln_sets']
        coll = db['vulnerabilities']
        basepath = os.path.dirname(__file__)
        filepath = os.path.abspath(os.path.join(basepath, ".."))
        archive_filepath = filepath + '/vuln_files/'
        filedir = os.chdir(archive_filepath)
        for item in os.listdir(filedir):
            if item.endswith('.json'):
                file_name = os.path.abspath(item)
                fp = open(file_name, 'r')
                json_data = json.loads(fp)
                for vuln in json_data:
                  print(vuln)
                  coll.insert(vuln)
                os.remove(file_name)
    except Exception as e:
        logging.exception(e)

我可以使用单个文件而不是多个文件,即做一个我写的文件:

from zipfile import ZipFile
import json
import pymongo

archive = ZipFile("vulners_collections/cve.zip")
archived_file = archive.open(archive.namelist()[0])
archive_content = archived_file.read()
archived_file.close()

connection = pymongo.MongoClient("mongodb://localhost")
db=connection.vulnerability
vuln1 = db.vulnerability_collection
vulners_objects = json.loads(archive_content)

for item in vulners_objects:
    vuln1.insert(item)

3 个答案:

答案 0 :(得分:1)

根据我上面的评论:

我没有使用glob的经验,但是从浏览文档中我得到的印象是archive_files是一个简单的文件路径列表作为字符串,对吗?您无法在字符串上执行.open之类的操作(因此您的错误),因此请尝试将代码更改为:

    ...
    archive_filepath = filepath + '/vuln_files/'
    archive_files = glob.glob(archive_filepath + "/*.zip")

    for file in archive_files:
        with open(file, "r") as currentFile:
            file_content = currentFile.read()
            vuln_content = json.loads(file_content)
            for item in vuln_content:
                coll.insert(item)
   ...

file不是文件对象或任何东西,只是一个简单的字符串。所以你不能在它上面执行字符串不支持的方法。

答案 1 :(得分:0)

您正在通过将其设置为namelist方法的结果来重新定义迭代器。在for中需要一个for循环来遍历zip文件的内容,当然还有一个新的迭代器变量。

答案 2 :(得分:0)

isn&#t; file.close错误,正确的调用是file.close()。

你可以使用json.load()直接加载文件,而不是json.loads()

fp = open(file_name, 'r')
json_data = json.load(fp)
fp.close()