近期對FTP及Excel數據處理的一些摸索

一個多月沒寫隨筆了,主要是發的東西,本身感受也很垃圾,說又說回來,誰不是從垃圾變強的,因此不比比,還得努力。come on!!python

Python學習也有段時間了,近期爲了解決同事的一個難題,因此咱們決定聯繫Python的同時,幫他解決這個難題。他的難題簡單歸納來講,每次他須要登陸某單位的FTP服務器,下載好幾個項目一個月的數據,而後找到其中地源熱泵數據,所有複製到本地,而後打開每一個項目的文件,一行一行的複製到Excel中,而後再進行數據處理,其中一個項目,一個時間的數據截圖以下:json

 

 

數據均是以逗號分割,可想而知,他每次僅僅的粘貼複製是有多費勁。因此咱們就小試牛刀,把本身學的Python用上,用代碼給他解決這個問題。服務器

開始的時候也沒有接觸過FTP這個模塊,因此最開始就想怎麼能用代碼,把想要的數據下載到本地,因此就學習了ftplib這個模塊。而後逐層深刻,怎麼能下載每一天的,以致於到每一個項目的每一天,最終的download的模塊的全部的代碼以下:app

 

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 import os,sys
 4 from datetime import datetime,timedelta
 5 
 6 from ftplib import FTP            #加載ftp模塊
 7 import xlrd,xlwt
 8 
 9 
10 starttime = input("請輸入想要下載文件的開始時間(格式:20170101):\n")
11 # endtime = parse(input("請輸入想要下載文件的結束時間:\n"))                       
12 
13 # input_time = int(input("請輸入想要下載前多少天的數據:\n"))
14 
15 base_dir = os.path.dirname(os.path.abspath(__file__))
16 print(base_dir)
17 sys.path.append(base_dir)
18 
19 ftp=FTP()                         #設置變量
20 #ftp.set_debuglevel(2)             #打開調試級別2,顯示詳細信息
21 ftp.connect("IP地址",21)          #鏈接的ftp sever和端口
22 ftp.login("用戶名","密碼>")      #鏈接的用戶名,密碼
23 
24 
25 
26 if ftp.cwd("目錄" + starttime + "/"):    #進入遠程目錄
27     #print(ftp.nlst())
28     #downloadlist = ftp.nlst()               
29     bufsize=1024                      #設置的緩衝區大小
30     
31     for filename in ftp.nlst():
32         
33         if "GHP" in filename and "0800_001.cmep" in filename:           #須要下載的文件
34             file_handle=open(base_dir + "/data/" + filename,"wb").write #以寫模式在本地打開文件
35             #file_handle=open(filename,"wb").write
36             ftp.retrbinary("RETR "+filename,file_handle,bufsize) #接收服務器上文件並寫入本地文件
37 #            ftp.set_debuglevel(0)             #關閉調試模式
38             print(filename + "已經下載完成!")
39             
40         
41     ftp.cwd("/")
42 
43 print("您想要的文件已經所有下載完成,歡迎下次使用!")
44 ftp.quit()                        #退出ftp

 

download的執行結果是,是把全部項目某一天的代碼所有下載到本地data目錄下。下載的結果以下:學習

 

 

此時數據下載好了,就想着該如何把數據整理到Excel中了,因此還須要去學習Python中關於Excel的庫,咱們主要用的xlrd和xlwt,不懂的能夠百度。咱們就寫了把後綴名微cmep的文件,寫的Excel裏的一個模塊handle,在過程當中咱們發現,對於每個項目來講,咱們同事所想要的數據的行數都不相同,因此老師就給咱們一個思路,寫一個關於地源熱泵每個項目配置文件,就解決了這個問題。因此咱們就動手寫了一個json格式的配置文件,代碼以下:ui

 

 1 import json
 2 import os,sys
 3 
 4 base_dir = os.path.dirname(os.path.abspath(__file__))
 5 print(base_dir)
 6 sys.path.append(base_dir)
 7 
 8 
 9 file_list = os.listdir(base_dir + "/data/")
10 # print(file_list)
11 
12 output_data = {"items":[]}
13 
14 for filename in file_list:
15     with open(base_dir + "/data/" + filename) as f:
16         lines = f.readlines() 
17         # print(lines)
18         line_number = []
19         for nums,line in enumerate(lines):
20             if line.split(",")[10] == "GJ" or line.split(",")[10] == "kWh":
21                 line_number.append(nums)
22                
23         out_filename = filename.split("_GHP")[0].split("SSTJEC_")[1]
24         print(out_filename)
25         data = {"item":out_filename,"download_line":line_number}
26         output_data["items"].append(data)
27         
28 with open("settings.json","w") as f1:
29     json.dump(output_data,f1)

 

運行write_json.py的這個文件,得出每一個項目所須要下載的不一樣行,而後咱們根據這個配置文件,開始把須要的參數寫入到Excel文件中,具體代碼以下:spa

 

 1 import os,sys,json
 2 import xlrd,xlwt
 3 
 4 #把當前文件所在目錄添加到電腦的環境變量
 5 base_dir = os.path.dirname(os.path.abspath(__file__))
 6 print(base_dir)
 7 sys.path.append(base_dir)
 8 
 9 #當前文件所在目錄data文件夾下的全部文件名以列表的形式存到file_list裏
10 file_list = os.listdir(base_dir+"/data")
11 print(file_list)
12 
13 #打開當前文件所在目錄的settings.json文件
14 with open("settings.json","r") as f1:
15     settings = json.load(f1)
16 
17 #以寫的形式打開一個workbook
18 my_workbook = xlwt.Workbook()
19 
20 for filename in file_list:
21     year = filename.split("_")[-2][:4]
22     date = filename.split("_")[-2][4:8]
23 
24     #從json文件中獲取到每一個項目的配置文件,而後下載相應的行到Excel裏
25     for setting in settings["items"]:
26         project_name = filename.split("_GHP")[0].split("SSTJEC_")[1]
27         if project_name == setting["item"]:
28             my_sheet = my_workbook.add_sheet(project_name + "_" + date)
29             with open(base_dir+"/data/"+filename) as f2:
30                 lines = f2.readlines()
31                 step = 0
32 
33                 #把所須要的數據寫到Excel中
34                 for nums,line in enumerate(lines):
35                     if nums in setting["download_line"]:
36                         re_time = line.split(",")[6]
37                         out_file = line.split(",")[7]
38                         energy = line.split(",")[-2]
39                         unit = line.split(",")[10]
40 
41                         my_sheet.write(step,0,out_file)
42                         my_sheet.write(step,1,re_time)
43                         my_sheet.write(step,2,energy)
44                         my_sheet.write(step,3,unit)
45                         step += 1
46 
47 my_workbook.save(base_dir+"/handle/" + year +" cmep_to_excel.xls")

 

運行handle文件後,獲得寫入Excel文件的結果以下:debug

 

 

成功的寫入了Excel文件,對於咱們同事來講,這個是一個皆大歡喜的結果,可是他還須要進行數據處理,因此咱們想,索性幫他用代碼把數據處理也作了,最後咱們就寫了一個result的文件,把他想要的兩個時間內的數據作差,而後再寫入另外一個Excel中,下面是代碼:調試

 

 1 import xlrd,xlwt
 2 import os,sys
 3 
 4 base_dir = os.path.dirname(os.path.abspath(__file__))
 5 print(base_dir)
 6 sys.path.append(base_dir)
 7 
 8 file_list = os.listdir(base_dir+"/handle/")
 9 print(file_list)
10 
11 my_workbook = xlwt.Workbook()
12 
13 for filename in file_list:
14     date,project = filename.split(" ")[0],filename.split(" ")[-1]
15 
16     if project == "cmep_to_excel.xls":
17 
18         myworkbook = xlrd.open_workbook((base_dir+"/handle/" + filename))
19         i = 0
20         o = 1
21         while o < len(myworkbook.sheets()):
22             frist_sheet = myworkbook.sheets()[i]
23             second_sheet = myworkbook.sheets()[o]
24             rows_num = second_sheet.nrows
25             print(rows_num)
26 
27             my_sheet = my_workbook.add_sheet(frist_sheet.cell(0,0).value.split("_GHP_")[0])
28             
29             #在每一個表單的頭一行添加表頭
30             my_sheet.write(0,0,"數據類型")
31             my_sheet.write(0,1,"日期")
32             my_sheet.write(0,2,"數據")
33             my_sheet.write(0,3,"單位")
34             m = 1
35             n = 0
36             while n < rows_num:
37                 
38                 out_file = frist_sheet.cell(n,0).value
39                 re_time = frist_sheet.cell(n,1).value
40                 energy1 = float(frist_sheet.cell(n,2).value)
41                 unit = frist_sheet.cell(n,3).value
42 
43                 energy2 = float(second_sheet.cell(n,2).value)
44                 energy_output = energy2 - energy1
45 
46                 my_sheet.write(m,0,out_file)
47                 my_sheet.write(m,1,re_time)
48                 my_sheet.write(m,2,energy_output)
49                 my_sheet.write(m,3,unit)
50 
51                 m +=1
52                 n +=1
53             i += 2
54             o += 2
55 
56         my_workbook.save(base_dir+"/handle/" + date + " result.xls")

 

最後獲得他想要的結果文件,之後對於他這趟差事來講,那不是簡單到沒朋友,本身運行幾個代碼,全部的東西過程都不用管,結果就有了,大大提高了工做效率,爲咱們幾個同事點一個贊。excel

其實還有一個弊端,也就是下次和老師碰的一個點,就是本身把幾個模塊,整合到一個Python文件中,本身運行一個文件,就把全部過程都跑完,也就是後面須要增長的內容。

 

學習Python的時間仍是有限,主要本身也不是幹這個的,離本身理想仍是有很大的差距,昨天晚上憋了4個小時,才把最後的result文件寫玩,裏面須要改進的地方還有不少,還須要努力。你們也跟一塊兒努力把,大家的讚賞纔是我努力的源泉,歡迎轉發評論,歡迎批評指正。

相關文章
相關標籤/搜索