如何在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解析xml文件实例分享
Dec 04 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
实例说明Python中比较运算符的使用
May 13 Python
在Python中操作字典之update()方法的使用
May 22 Python
python中csv文件的若干读写方法小结
Jul 04 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
django框架单表操作之增删改实例分析
Dec 16 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
python实现将中文日期转换为数字日期
Jul 14 Python
Python实现天气查询软件
Jun 07 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
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
javascript 多浏览器 事件大全
2010/03/23 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
url传递的参数值中包含&amp;时,url自动截断问题的解决方法
2016/08/02 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
浅谈Python中的作用域规则和闭包
2018/03/20 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
python操作redis方法总结
2018/06/06 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
工程造价自荐信
2013/10/09 职场文书
门卫工作岗位职责
2013/12/17 职场文书
物业工作计划书
2014/01/10 职场文书
组织关系转移介绍信
2014/01/16 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
初中重阳节活动总结
2015/05/05 职场文书
杨善洲电影观后感
2015/06/04 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS