如何在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之wxPython应用实例
Sep 28 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
Python 元组操作总结
Sep 18 Python
python实现梯度下降和逻辑回归
Mar 24 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
神经网络训练采用gpu设置的方式
Mar 03 Python
python实现双链表
May 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禁止个别IP访问网站
2013/10/30 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
理解javascript封装
2016/02/23 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
全面了解python中的类,对象,方法,属性
2016/09/11 Python
Python操作mongodb的9个步骤
2018/06/04 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python爬虫实现获取下一页代码
2020/03/13 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
人事专员岗位职责
2013/11/20 职场文书
物流仓储计划书
2014/01/10 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
节约电力资源的建议书
2014/03/12 职场文书
售后服务承诺书
2014/03/26 职场文书
商场促销活动策划方案
2014/08/18 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年财务部工作总结
2014/11/11 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
Nginx缓存设置案例详解
2021/09/15 Servers
JavaScript实现栈结构详细过程
2021/12/06 Javascript
Nginx实现会话保持的两种方式
2022/03/18 Servers