如何在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 元组(Tuple)操作详解
Mar 11 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
python打开网页和暂停实例
Sep 30 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
python操作kafka实践的示例代码
Jun 19 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
python实现BP神经网络回归预测模型
Aug 09 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
Python 下载Bing壁纸的示例
Sep 29 Python
用Python 执行cmd命令
Dec 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框架功能对照表
2014/10/23 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
用Python实现命令行闹钟脚本实例
2016/09/05 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
Python设计密码强度校验程序
2020/07/30 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
升职自荐书范文
2013/11/28 职场文书
道德之星事迹材料
2014/05/03 职场文书
2014年征兵标语
2014/06/20 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
教师工作表现评语
2014/12/31 职场文书
师德师风个人总结
2015/02/06 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
Nginx配置https的实现
2021/11/27 Servers