在学习了一些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我们可以查看到我们导入的数据如图: