一個多月沒寫隨筆了,主要是發的東西,本身感受也很垃圾,說又說回來,誰不是從垃圾變強的,因此不比比,還得努力。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文件寫玩,裏面須要改進的地方還有不少,還須要努力。你們也跟一塊兒努力把,大家的讚賞纔是我努力的源泉,歡迎轉發評論,歡迎批評指正。