如何在django里上传csv文件并进行入库处理的方法


Posted in Python onJanuary 02, 2019

运维平台导入数据这一功能实在是太重要了,我敢说在没有建自己的cmdb平台前,大多数公司管理服务器信息肯定是表格,用表格最麻烦的就是有点更新就得每个人发一份,这样大家信息才能统一,很不方便,终于有一天受不了了,搞了一个服务器信息管理平台,那面临的第一个问题不是说功能好或不不好,而是怎么才能把表里的数据导入到数据库中,所以你说重要不重要,当然如果你就喜欢自己手工录入(找虐的感觉),这个咱也不能说啥,各有所好嘛,那具体如何录的最快,这个不在我们今天的讨论范围,我只讨论如何自动导入。

提到导入,那一般有二个方法,一个是在前端上传完后存储在服务器上的某个目录里,然后读取文件进行分析处理。

另一种是上传文件后直接读取文件内容而不存储在服务器上,这二种方法都可以实现我们得目的,这篇主要是讨论的后面这种。

上传文件,首先我们建一个html文件,内容代码如下:

<form action="{% url "myapp:upload_csv" %}" method="POST" enctype="multipart/form-data" class="form-horizontal"> 
{% csrf_token %}
<div class="form-group">
  <label for="name" class="col-md-3 col-sm-3 col-xs-12 control-label">File: </label>
  <div class="col-md-8">
    <input type="file" name="csv_file" id="csv_file" required="True" class="form-control">
  </div>          
</div>
<div class="form-group">          
  <div class="col-md-3 col-sm-3 col-xs-12 col-md-offset-3" style="margin-bottom:10px;">
     <button class="btn btn-primary"> <span class="glyphicon glyphicon-upload" style="margin-right:5px;"></span>Upload </button>
  </div> 
</div>
</form>

这些都是基本的Html,只要主要enctype=”multipart/form-data”这个参数就可以,其它无特别说明。

展示如图:

如何在django里上传csv文件并进行入库处理的方法

加入路由,

url(r'^upload/csv/$', views.upload_csv, name='upload_csv'),

那接下来就是处理上传的文件并入库了,这个代码在views.py文件里,代码如下:

def upload_csv(request):
	data = {}
	if "GET" == request.method:
		return render(request, "myapp/upload_csv.html", data)
  # if not GET, then proceed
	try:
		csv_file = request.FILES["csv_file"]
		if not csv_file.name.endswith('.csv'):
			messages.error(request,'File is not CSV type')
			return HttpResponseRedirect(reverse("myapp:upload_csv"))
    #if file is too large, return
		if csv_file.multiple_chunks():
			messages.error(request,"Uploaded file is too big (%.2f MB)." % (csv_file.size/(1000*1000),))
			return HttpResponseRedirect(reverse("myapp:upload_csv"))
 
		file_data = csv_file.read().decode("utf-8")		
 
		lines = file_data.split("\n")
		#loop over the lines and save them in db. If error , store as string and then display
		for line in lines:						
			fields = line.split(",")
			data_dict = {}
			data_dict["name"] = fields[0]
			data_dict["start_date_time"] = fields[1]
			data_dict["end_date_time"] = fields[2]
			data_dict["notes"] = fields[3]
			try:
				form = EventsForm(data_dict)
				if form.is_valid():
					form.save()					
				else:
					logging.getLogger("error_logger").error(form.errors.as_json())												
			except Exception as e:
				logging.getLogger("error_logger").error(repr(e))					
				pass
 
	except Exception as e:
		logging.getLogger("error_logger").error("Unable to upload file. "+repr(e))
		messages.error(request,"Unable to upload file. "+repr(e))
 
	return HttpResponseRedirect(reverse("myapp:upload_csv"))

代码解释:

最开始判断如果是get请求直接渲染upload_csv.html文件,如果是post请求那么进行分析处理,首先是检查文件名是否是以csv结尾的,如果是就处理,不是就提示错误信息,再就是检查下上传文件的大小,其实这些检查也还好,如果是自己整理的表导入基本也不用做这些检查了,如果是有多人操作这些检查就有必要了,然后开始循环迭代文件行,内容是以逗号分隔,这里假设就是4列,如果你的表格列很多可以做修改,最后保存入库,如果有错误就记录错误信息到日志文件中。

至此我们需要的功能就完成了,虽然简单但非常实用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python多重继承实例
Oct 11 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
Aug 20 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
Python的缺点和劣势分析
Nov 19 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
python的json包位置及用法总结
Jun 21 Python
python生成器与迭代器详解
Jan 01 #Python
使用python3实现操作串口详解
Jan 01 #Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 #Python
python 内置模块详解
Jan 01 #Python
python配置grpc环境
Jan 01 #Python
python制作mysql数据迁移脚本
Jan 01 #Python
在python中将字符串转为json对象并取值的方法
Dec 31 #Python
You might like
长波知识介绍
2021/03/01 无线电
如何在PHP中使用Oracle数据库(6)
2006/10/09 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
python PyTorch预训练示例
2018/02/11 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
使用python画社交网络图实例代码
2019/07/10 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
租房协议书范文
2014/08/20 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
2014财务年终工作总结
2014/12/08 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS