如何在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中的reduce内建函数使用方法指南
Aug 31 Python
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
python一键去抖音视频水印工具
Sep 14 Python
Tesserocr库的正确安装方式
Oct 19 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
python中如何设置代码自动提示
Jul 15 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
python实现canny边缘检测
Sep 14 Python
Python读取pdf表格写入excel的方法
Jan 22 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
网站当前的在线人数
2006/10/09 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
jquery中each遍历对象和数组示例
2014/08/05 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
js数据类型检测总结
2018/08/05 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
python实现简易版计算器
2020/06/22 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
python+requests接口自动化框架的实现
2020/08/31 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
护理专科毕业推荐信
2013/11/10 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
考核工作实施方案
2014/03/30 职场文书
标准毕业生自荐信
2014/06/24 职场文书
出售房屋协议书范本
2014/10/06 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
python Polars库的使用简介
2021/04/21 Python