如何在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 相关文章推荐
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
5种Python单例模式的实现方式
Jan 14 Python
Python程序退出方式小结
Dec 09 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
Python requests模块实例用法
Feb 11 Python
对python 自定义协议的方法详解
Feb 13 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
Python jieba库用法及实例解析
Nov 04 Python
Python无头爬虫下载文件的实现
Apr 02 Python
Python接口测试数据库封装实现原理
May 09 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 MVC模式在网站架构中的实现分析
2010/03/04 PHP
利用php实现禁用IE和火狐的缓存问题
2012/12/03 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
详解如何利用Cython为Python代码加速
2018/01/27 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
python交互界面的退出方法
2019/02/16 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
python使用minimax算法实现五子棋
2019/07/29 Python
python批量处理文件或文件夹
2020/07/28 Python
Python with语句和过程抽取思想
2019/12/23 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
selenium如何定位span元素的实现
2021/01/13 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
俄罗斯游戏商店:Buka
2020/03/01 全球购物
简述数据库的设计过程
2015/06/22 面试题
应届生法律顾问求职信
2013/11/19 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
教育教学工作反思
2016/02/24 职场文书
python字典的元素访问实例详解
2021/07/21 Python