如何在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中使用SAX解析xml实例
Nov 21 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
python判断输入日期为第几天的实例
Nov 13 Python
python操作日志的封装方法(两种方法)
May 23 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
numba提升python运行速度的实例方法
Jan 25 Python
Python如何配置环境变量详解
May 18 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实现的一个简单json rpc框架实例
2015/03/30 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
Python3爬虫全国地址信息
2019/01/05 Python
详解python中list的使用
2019/03/15 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
python判断正负数方式
2020/06/03 Python
学python爬虫能做什么
2020/07/29 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
信息技术毕业生自荐信范文
2014/03/13 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
PHP命令行与定时任务
2021/04/01 PHP
Python中使用Lambda函数的5种用法
2021/04/01 Python
MySQL数据迁移相关总结
2021/04/29 MySQL
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫