如何在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实现删除文件中含“指定内容”的行示例
Jun 09 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
python连接PostgreSQL过程解析
Feb 09 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
使用Keras实现简单线性回归模型操作
Jun 12 Python
如何在mac下配置python虚拟环境
Jul 06 Python
Python headers请求头如何实现快速添加
Nov 03 Python
使用python操作lmdb对数据读取的实例
Dec 11 Python
Django 实现图片上传和下载功能
Dec 31 Python
python上下文管理器异常问题解决方法
Feb 07 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 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函数 serialize()和unserialize()
2012/02/04 PHP
PHP文件读写操作相关函数总结
2014/11/18 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
php fread函数使用方法总结
2019/05/28 PHP
js动态生成指定行数的表格
2013/07/11 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
token 机制和实现方式
2020/12/15 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python正则分组的应用
2013/11/10 Python
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
Python实现常见的回文字符串算法
2018/11/14 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
numpy库reshape用法详解
2020/04/19 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
护士的岗位职责
2013/12/04 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
决心书格式范文
2015/09/23 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
mysql知识点整理
2021/04/05 MySQL
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis