如何在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代理抓取并验证使用多线程实现
May 03 Python
python实现简单的TCP代理服务器
Oct 08 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
python入门教程之识别验证码
Mar 04 Python
分享一个简单的python读写文件脚本
Nov 25 Python
用python处理MS Word的实例讲解
May 08 Python
详解Python with/as使用说明
Dec 13 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
Python正则表达式学习小例子
Mar 03 Python
Python爬虫基础之爬虫的分类知识总结
May 13 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php二维数组排序详解
2013/11/06 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
python实现读取大文件并逐行写入另外一个文件
2018/04/19 Python
flask中过滤器的使用详解
2018/08/01 Python
python重试装饰器的简单实现方法
2019/01/31 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
中专自荐信
2013/10/13 职场文书
财务经理岗位职责
2013/11/09 职场文书
制药工程专业毕业生推荐信
2013/12/24 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
消防安全责任书
2014/04/14 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
留学经费担保书
2014/05/12 职场文书
法律专业自荐信
2014/06/03 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
公积金具结保证书
2015/05/11 职场文书
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server