在Django框架下向MongoDB数据库中导入.scv文件数据

在学习了一些MongoDB和Django框架的一些基础知识后,我对MongoDB以及Django知识已经有了一个初步的掌握,是时候对学长的项目里面的东西进行一个初步的实践了,于是我选择从Django框架中向MongoDB导入数据的这部分代码开始。通过复用几段学长项目里的代码,在我自己新建的项目中实现向数据库中导入csv文件。

1.新建一个Django项目

选择Exisiting interpreter,打开你的python安装文件夹,选择python.exe

建立好后会得到如下界面

其中,与项目同名的vis1目录是项目的核心文件;templates目录是HTML文件存放处,也就是MTV中的T。manage.py是Django项目管理文件。

在核心文件vis1目录中:

_init_.py:空文件

settings.py:主配置文件

urls.py:主路由文件

wsgi.py:网关接口

2.创建APP

在每个Django项目中可以包含多个APP,相当于一个大型项目中的分系统、子模块、功能部件等等,相互之间比较独立,但也可以有联系。所有的APP共享项目资源。要在Django框架下链接MongoDB,我们就必须建立一个APP。(为了方便我复用学长项目中的代码,我创建了一个与学长相同的APP:datas)

在Pycharm下方的Terminal终端中输入命令:

python manage.py startapp datas

创建好后,django自动生成“datas”文件夹,及一系列文件: (注意:如果你选择vis1->new->python package这样的方式得到的文件夹里将没有这一系列的文件)

3.编辑APP

 在Datas中,models是与数据库操作相关,存入或读取数据的文件,所以首先我们需要对它进行配置。刚打开里面只有一句引入库的语句,你需要在这里编写对你要导入数据库的列名进行定义:

 因为是为了理解并实践学长的代码,我这里就直接粘贴学长项目中的这部分代码了:

from django.db import models
from mongoengine import *
# Create your models here.

class Alldata(models.Model):
    id = models.BigIntegerField(primary_key=True)
    ipsmalltype = models.IntegerField()
    filelen = models.BigIntegerField()
    fileaffix = models.CharField(max_length=10, null=True)
    iscracked = models.NullBooleanField()
    starttime = models.DateTimeField()
    srcip = models.CharField(max_length=45)
    dstip = models.CharField(max_length=45)
    srcport = models.IntegerField()
    dstport = models.IntegerField()
    vpi1 = models.IntegerField(null=True)
    vpi2 = models.IntegerField(null=True)
    atm1aaltype = models.IntegerField(null=True)

4.注册APP

 在配置好了models之后,你要让你的数据库知道该给那个APP创建表,所以需要在vis1目录的settings中注册APP。也就是在

settings中的INSTALLED_APPS中添加你刚才创建好的datas

5.连接mongoDB

一般在Django框架中连接数据库都需要对settings中的DATABASES进行配置,如下图:

而我们这里使用MongoDB数据库,它可以不使用DATABASES,在学长的代码中,他是这样做的:

在DATABASES旁边建立一个DBCONFIG,然后将DATABSES中的内容删掉:

这样,每次连接MongoDB时只需要调用DBCONFIG就行了

6.编写导入csv部分的代码

先建立一个.py文件,然后在里面编写向数据库中导入数据功能的代码,我这里就直接复制学长的项目中有关这一段的代码:

class Data2Mongo:
    filename = 'ip{}.csv-数据处理.csv'
    path = 'C:\\Users\\Administrator\\Desktop\\ChinaVis\\2016年数据可视分析挑战赛-挑战1-数据\\'
    count = range(1, 11)
    c_raw = 'raw_data'
    c_clear = 'clear_data'
    c_uncracked = 'uncracked_data'
    c_merge = 'merge_data'
    colname = ['ipsmalltype', 'filelen', 'fileaffix', 'iscracked', 'starttime',
               'srcip', 'dstip', 'srcport', 'dstport', ' vpi1', 'vpi2', 'atm1aaltype']
    checklist = ['ipsmalltype', 'filelen', 'fileaffix', 'iscracked', 'starttime',
                 'srcip', 'dstip', 'srcport', 'dstport', 'vpi1', 'vpi2', 'atm1aaltype']
    checklist_merge = ['ipsmalltype', 'fileaffix', 'starttime', 'srcip',
                       'dstip', 'srcport', 'dstport', 'vpi1', 'vpi2', 'atm1aaltype']
    res = []
    max_len = 100000

    def __init__(self):
        self.files = []
        for i in self.count:
            self.files.append(self.filename.format(i))
        self.client = MongoClient(DBCONFIG['HOST'], DBCONFIG['PORT'])
        self.db = self.client.__getattr__(DBCONFIG['NAME'])
        self.dst_raw = self.db[self.c_raw]
        self.dst_clear = self.db[self.c_clear]
        self.dst_uncracked = self.db[self.c_uncracked]
        self.dst_merge = self.db[self.c_merge]

    def __del__(self):
        self.client.close()

    @staticmethod
    def convert_fileaffix(fileaffix):
        if len(fileaffix) == 0:
            return ''
        while fileaffix[0] == '.':
            fileaffix = fileaffix[1:]
        if '.' in fileaffix:
            return None
        else:
            return fileaffix

    def data2mongo(self):
        self.dst_raw.remove({})
        self.res.clear()
        for i in self.count:
            print('正在处理文件:%s' % (self.path + self.filename.format(i)))
            with open(self.path + self.filename.format(i)) as infile:
                reader = csv.reader(infile)
                next(reader)
                for row in reader:
                    fileaffix = self.convert_fileaffix(str(row[3]))
                    if fileaffix is None:
                        continue
                    self.res.append({
                        'ipsmalltype': int(row[1]),
                        'filelen': int(row[2]),
                        'fileaffix': fileaffix if fileaffix != '' else None,
                        'iscracked': int(row[4]) if row[4] == '0' else 1,
                        'starttime': datetime.strptime(row[5], '%Y/%m/%d %H:%M:%S'),
                        'srcip': str(row[6]),
                        'dstip': str(row[7]),
                        'srcport': int(row[8]),
                        'dstport': int(row[9]),
                        'vpi1': int(row[10]) if row[10] != '' else None,
                        'vpi2': int(row[11]) if row[11] != '' else None,
                        'atm1aaltype': int(row[12]) if row[12] != '' else None
                    })
                    if self.res.__len__() == self.max_len:
                        self.dst_raw.insert_many(self.res)
                        self.res.clear()
        if self.res.__len__() > 0:
            self.dst_raw.insert_many(self.res)
            self.res.clear()

记得把需要导入的库及要引用的文件导入,不然会报错:

from pymongo import MongoClient
from datetime import datetime
from vis.settings import DBCONFIG
import csv

其次,需要注意导入的文件路径一定要正确,文件名之间的分隔符是\\,别写反了

7.编写一个调用Data2Mongo的.py文件

我这里建立一个handles.py(为避免复用学长的代码出错,所以取了和学长项目中一样的名称)

from data2mongo import Data2Mongo

import time
if __name__ == '__main__':
    start = time.clock()
    tomongo = Data2Mongo()
    tomongo.data2mongo()

 8.运行handles.py

 

这样,在Django框架下向MongoDB导入.csv文件便实现了。

用Navicate for MongoDB我们可以查看到我们导入的数据如图:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值