我有一个脚本从文件夹中获取所有.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)
答案 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()