如何在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 18 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
设置python3为默认python的方法
Oct 31 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
Apr 05 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
python打印直角三角形与等腰三角形实例代码
Oct 20 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
Django nginx配置实现过程详解
Sep 10 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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&amp;&amp;mysql)二
2006/10/09 PHP
PHP导入Excel到MySQL的方法
2011/04/23 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
python使用pil生成图片验证码的方法
2015/05/08 Python
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
python中logging库的使用总结
2017/10/18 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
pygame实现成语填空游戏
2019/10/29 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
文明美德伴我成长演讲稿
2014/05/12 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
2016大一新生军训感言
2015/12/08 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
我收到了德劲DE1107
2022/04/05 无线电
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技