如何在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 26 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
在Python中通过getattr获取对象引用的方法
Jan 21 Python
python实现Virginia无密钥解密
Mar 20 Python
如何在django中实现分页功能
Apr 22 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 Python
Python如何让字典保持有序排列
Apr 29 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
zend framework多模块多布局配置
2011/02/26 PHP
php array的学习笔记
2012/05/16 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
一个实用的php验证码类
2017/07/06 PHP
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
easy_install python包安装管理工具介绍
2013/02/10 Python
python实现数独算法实例
2015/06/09 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Python计算IV值的示例讲解
2020/02/28 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
django使用graphql的实例
2020/09/02 Python
酒店公关部经理岗位职责
2013/11/24 职场文书
优秀员工评语
2014/02/10 职场文书
信息管理专业自荐书
2014/06/05 职场文书
学校花圃的标语
2014/06/18 职场文书
共青团员自我评价范文
2014/09/14 职场文书
童年读书笔记
2015/06/26 职场文书
建房合同协议书
2016/03/21 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python