如何在django里上传csv文件并进行入库处理的方法

 更新时间:2019年01月02日 08:33:24   作者:mindg.cn  
这篇文章主要介绍了如何在django里上传csv文件并进行入库处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

运维平台导入数据这一功能实在是太重要了,我敢说在没有建自己的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”这个参数就可以,其它无特别说明。

展示如图:

加入路由,

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给朋友做生日快乐祝福

    生活中除了给男神女神表白,还会遇到朋友过生日,所以小编今天就给大家带来了一个送给朋友的生日祝福程序,这篇文章主要给大家介绍了关于如何用python给朋友做生日快乐祝福的相关资料,需要的朋友可以参考下
    2023-11-11
  • Python实现PS滤镜碎片特效功能示例

    Python实现PS滤镜碎片特效功能示例

    这篇文章主要介绍了Python实现PS滤镜碎片特效功能,结合实例形式分析了Python实现PS滤镜碎片效果的具体步骤与相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • jupyter notebook内核启动失败问题及解决方法

    jupyter notebook内核启动失败问题及解决方法

    这篇文章主要介绍了解决jupyter notebook内核启动失败问题,本文给大家介绍了问题原因分析及解决方案,图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子

    使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子

    这篇文章主要介绍了使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子,使用的python wmi模块,需要的朋友可以参考下
    2014-04-04
  • Pygame实战之经典泡泡龙小游戏

    Pygame实战之经典泡泡龙小游戏

    Python版的消除类的游戏还是很多的,今天就出一个消除类——泡泡龙小游戏。文中的示例代码很详细,感兴趣的小伙伴快来跟随小编一起学习一下吧
    2021-12-12
  • python 使用多线程创建一个Buffer缓存器的实现思路

    python 使用多线程创建一个Buffer缓存器的实现思路

    这篇文章主要介绍了python 使用多线程创建一个Buffer缓存器的实现思路,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Python爬虫动态IP代理使用及防止被封的方法

    Python爬虫动态IP代理使用及防止被封的方法

    在进行网络爬虫时,经常会遇到网站的反爬机制,其中之一就是通过IP封禁来限制爬虫的访问,为了规避这种限制,使用动态IP代理是一种有效的方法,本文将介绍在Python爬虫中如何使用动态IP代理,以及一些防止被封的方法,文中有详细的代码讲解,需要的朋友可以参考下
    2023-11-11
  • 翻转数列python实现,求前n项和,并能输出整个数列的案例

    翻转数列python实现,求前n项和,并能输出整个数列的案例

    这篇文章主要介绍了翻转数列python实现,求前n项和,并能输出整个数列的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python英文单词大小写转换常用方法示例

    Python英文单词大小写转换常用方法示例

    这篇文章主要为大家介绍了Python英文单词大小写转换常用方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 用Python按时间分割txt文件中的数据方法步骤

    用Python按时间分割txt文件中的数据方法步骤

    这篇文章主要给大家介绍了如何用Python按时间分割txt文件中的数据的方法步骤,文中通过代码示例给大家讲解的非常详细,对大家学习Python处理txt文件有一定的帮助,需要的朋友可以参考下
    2023-12-12

最新评论