如何在django里上傳csv文件并進(jìn)行入庫(kù)處理的方法
運(yùn)維平臺(tái)導(dǎo)入數(shù)據(jù)這一功能實(shí)在是太重要了,我敢說(shuō)在沒(méi)有建自己的cmdb平臺(tái)前,大多數(shù)公司管理服務(wù)器信息肯定是表格,用表格最麻煩的就是有點(diǎn)更新就得每個(gè)人發(fā)一份,這樣大家信息才能統(tǒng)一,很不方便,終于有一天受不了了,搞了一個(gè)服務(wù)器信息管理平臺(tái),那面臨的第一個(gè)問(wèn)題不是說(shuō)功能好或不不好,而是怎么才能把表里的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中,所以你說(shuō)重要不重要,當(dāng)然如果你就喜歡自己手工錄入(找虐的感覺(jué)),這個(gè)咱也不能說(shuō)啥,各有所好嘛,那具體如何錄的最快,這個(gè)不在我們今天的討論范圍,我只討論如何自動(dòng)導(dǎo)入。
提到導(dǎo)入,那一般有二個(gè)方法,一個(gè)是在前端上傳完后存儲(chǔ)在服務(wù)器上的某個(gè)目錄里,然后讀取文件進(jìn)行分析處理。
另一種是上傳文件后直接讀取文件內(nèi)容而不存儲(chǔ)在服務(wù)器上,這二種方法都可以實(shí)現(xiàn)我們得目的,這篇主要是討論的后面這種。
上傳文件,首先我們建一個(gè)html文件,內(nèi)容代碼如下:
<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”這個(gè)參數(shù)就可以,其它無(wú)特別說(shuō)明。
展示如圖:
加入路由,
url(r'^upload/csv/$', views.upload_csv, name='upload_csv'),
那接下來(lái)就是處理上傳的文件并入庫(kù)了,這個(gè)代碼在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"))
代碼解釋?zhuān)?/strong>
最開(kāi)始判斷如果是get請(qǐng)求直接渲染upload_csv.html文件,如果是post請(qǐng)求那么進(jìn)行分析處理,首先是檢查文件名是否是以csv結(jié)尾的,如果是就處理,不是就提示錯(cuò)誤信息,再就是檢查下上傳文件的大小,其實(shí)這些檢查也還好,如果是自己整理的表導(dǎo)入基本也不用做這些檢查了,如果是有多人操作這些檢查就有必要了,然后開(kāi)始循環(huán)迭代文件行,內(nèi)容是以逗號(hào)分隔,這里假設(shè)就是4列,如果你的表格列很多可以做修改,最后保存入庫(kù),如果有錯(cuò)誤就記錄錯(cuò)誤信息到日志文件中。
至此我們需要的功能就完成了,雖然簡(jiǎn)單但非常實(shí)用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)PS濾鏡碎片特效功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)PS濾鏡碎片特效功能,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)PS濾鏡碎片效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-01-01jupyter?notebook內(nèi)核啟動(dòng)失敗問(wèn)題及解決方法
這篇文章主要介紹了解決jupyter?notebook內(nèi)核啟動(dòng)失敗問(wèn)題,本文給大家介紹了問(wèn)題原因分析及解決方案,圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04使用Python獲取CPU、內(nèi)存和硬盤(pán)等windowns系統(tǒng)信息的2個(gè)例子
這篇文章主要介紹了使用Python獲取CPU、內(nèi)存和硬盤(pán)等windowns系統(tǒng)信息的2個(gè)例子,使用的python wmi模塊,需要的朋友可以參考下2014-04-04Pygame實(shí)戰(zhàn)之經(jīng)典泡泡龍小游戲
Python版的消除類(lèi)的游戲還是很多的,今天就出一個(gè)消除類(lèi)——泡泡龍小游戲。文中的示例代碼很詳細(xì),感興趣的小伙伴快來(lái)跟隨小編一起學(xué)習(xí)一下吧2021-12-12python 使用多線程創(chuàng)建一個(gè)Buffer緩存器的實(shí)現(xiàn)思路
這篇文章主要介紹了python 使用多線程創(chuàng)建一個(gè)Buffer緩存器的實(shí)現(xiàn)思路,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Python爬蟲(chóng)動(dòng)態(tài)IP代理使用及防止被封的方法
在進(jìn)行網(wǎng)絡(luò)爬蟲(chóng)時(shí),經(jīng)常會(huì)遇到網(wǎng)站的反爬機(jī)制,其中之一就是通過(guò)IP封禁來(lái)限制爬蟲(chóng)的訪問(wèn),為了規(guī)避這種限制,使用動(dòng)態(tài)IP代理是一種有效的方法,本文將介紹在Python爬蟲(chóng)中如何使用動(dòng)態(tài)IP代理,以及一些防止被封的方法,文中有詳細(xì)的代碼講解,需要的朋友可以參考下2023-11-11翻轉(zhuǎn)數(shù)列python實(shí)現(xiàn),求前n項(xiàng)和,并能輸出整個(gè)數(shù)列的案例
這篇文章主要介紹了翻轉(zhuǎn)數(shù)列python實(shí)現(xiàn),求前n項(xiàng)和,并能輸出整個(gè)數(shù)列的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python英文單詞大小寫(xiě)轉(zhuǎn)換常用方法示例
這篇文章主要為大家介紹了Python英文單詞大小寫(xiě)轉(zhuǎn)換常用方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01用Python按時(shí)間分割txt文件中的數(shù)據(jù)方法步驟
這篇文章主要給大家介紹了如何用Python按時(shí)間分割txt文件中的數(shù)據(jù)的方法步驟,文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家學(xué)習(xí)Python處理txt文件有一定的幫助,需要的朋友可以參考下2023-12-12