如何在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中eval的强大与危害
Mar 13 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
Python 中的 import 机制之实现远程导入模块
Oct 29 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
python名片管理系统开发
Jun 18 Python
Django REST 异常处理详解
Jul 15 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 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调用Oracle存储过程的方法
2008/09/12 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
php牛逼的面试题分享
2013/01/18 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
HTTP 304错误的详细讲解
2013/11/13 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
javascript实现简单的二级联动
2015/03/19 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
node.js如何操作MySQL数据库
2020/10/29 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
Python中无限元素列表的实现方法
2014/08/18 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python3多线程基础知识点
2019/02/19 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
python 解决函数返回return的问题
2020/12/05 Python
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
质检部职责
2013/12/28 职场文书
市场营销计划书
2019/04/24 职场文书