一个多月没写随笔了,主要是发的东西,自己感觉也很垃圾,说又说回来,谁不是从垃圾变强的,所以不比比,还得努力。come on!!
Python 学习也有段时间了,近期为了解决同事的一个难题,所以我们决定联系 Python 的同时,帮他解决这个难题。他的难题简单概括来说,每次他需要登录某单位的 FTP 服务器,下载好几个项目一个月的数据,然后找到其中地源热泵数据,全部复制到本地,然后打开每个项目的文件,一行一行的复制到 Excel 中,然后再进行数据处理,其中一个项目,一个时间的数据截图如下:数据均是以逗号分割,可想而知,他每次仅仅的粘贴复制是有多费劲。所以我们就小试牛刀,把自己学的 Python 用上,用代码给他解决这个问题。
开始的时候也没有接触过 FTP 这个模块,所以最开始就想怎么能用代码,把想要的数据下载到本地,所以就学习了 ftplib 这个模块。然后逐层深入,怎么能下载每一天的,以至于到每个项目的每一天,最终的 download 的模块的所有的代码如下:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import os,sys
- from datetime import datetime,timedelta
- from ftplib import FTP #加载ftp模块
- import xlrd,xlwt
- starttime = input("请输入想要下载文件的开始时间(格式:20170101):\n")
- # endtime = parse(input("请输入想要下载文件的结束时间:\n"))
- # input_time = int(input("请输入想要下载前多少天的数据:\n"))
- base_dir = os.path.dirname(os.path.abspath(__file__))
- print(base_dir)
- sys.path.append(base_dir)
- ftp=FTP() #设置变量
- #ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
- ftp.connect("IP地址",21) #连接的ftp sever和端口
- ftp.login("用户名","密码>") #连接的用户名,密码
- if ftp.cwd("目录" + starttime + "/"): #进入远程目录
- #print(ftp.nlst())
- #downloadlist = ftp.nlst()
- bufsize=1024 #设置的缓冲区大小
- for filename in ftp.nlst():
- if "GHP" in filename and "0800_001.cmep" in filename: #需要下载的文件
- file_handle=open(base_dir + "/data/" + filename,"wb").write #以写模式在本地打开文件
- #file_handle=open(filename,"wb").write
- ftp.retrbinary("RETR "+filename,file_handle,bufsize) #接收服务器上文件并写入本地文件
- # ftp.set_debuglevel(0) #关闭调试模式
- print(filename + "已经下载完成!")
- ftp.cwd("/")
- print("您想要的文件已经全部下载完成,欢迎下次使用!")
- ftp.quit() #退出ftp
download 的执行结果是,是把所有项目某一天的代码全部下载到本地 data 目录下。下载的结果如下:
此时数据下载好了,就想着该如何把数据整理到 Excel 中了,所以还需要去学习 Python 中关于 Excel 的库,我们主要用的 xlrd 和 xlwt,不懂的可以百度。我们就写了把后缀名微 cmep 的文件,写的 Excel 里的一个模块 handle,在过程中我们发现,对于每一个项目来说,我们同事所想要的数据的行数都不相同,所以老师就给我们一个思路,写一个关于地源热泵每一个项目配置文件,就解决了这个问题。所以我们就动手写了一个 json 格式的配置文件,代码如下:
- import json
- import os,sys
- base_dir = os.path.dirname(os.path.abspath(__file__))
- print(base_dir)
- sys.path.append(base_dir)
- file_list = os.listdir(base_dir + "/data/")
- # print(file_list)
- output_data = {"items":[]}
- for filename in file_list:
- with open(base_dir + "/data/" + filename) as f:
- lines = f.readlines()
- # print(lines)
- line_number = []
- for nums,line in enumerate(lines):
- if line.split(",")[10] == "GJ" or line.split(",")[10] == "kWh":
- line_number.append(nums)
- out_filename = filename.split("_GHP")[0].split("SSTJEC_")[1]
- print(out_filename)
- data = {"item":out_filename,"download_line":line_number}
- output_data["items"].append(data)
- with open("settings.json","w") as f1:
- json.dump(output_data,f1)
运行 write_json.py 的这个文件,得出每个项目所需要下载的不同行,然后我们根据这个配置文件,开始把需要的参数写入到 Excel 文件中,具体代码如下:
- import os,sys,json
- import xlrd,xlwt
- #把当前文件所在目录添加到电脑的环境变量
- base_dir = os.path.dirname(os.path.abspath(__file__))
- print(base_dir)
- sys.path.append(base_dir)
- #当前文件所在目录data文件夹下的所有文件名以列表的形式存到file_list里
- file_list = os.listdir(base_dir+"/data")
- print(file_list)
- #打开当前文件所在目录的settings.json文件
- with open("settings.json","r") as f1:
- settings = json.load(f1)
- #以写的形式打开一个workbook
- my_workbook = xlwt.Workbook()
- for filename in file_list:
- year = filename.split("_")[-2][:4]
- date = filename.split("_")[-2][4:8]
- #从json文件中获取到每个项目的配置文件,然后下载相应的行到Excel里
- for setting in settings["items"]:
- project_name = filename.split("_GHP")[0].split("SSTJEC_")[1]
- if project_name == setting["item"]:
- my_sheet = my_workbook.add_sheet(project_name + "_" + date)
- with open(base_dir+"/data/"+filename) as f2:
- lines = f2.readlines()
- step = 0
- #把所需要的数据写到Excel中
- for nums,line in enumerate(lines):
- if nums in setting["download_line"]:
- re_time = line.split(",")[6]
- out_file = line.split(",")[7]
- energy = line.split(",")[-2]
- unit = line.split(",")[10]
- my_sheet.write(step,0,out_file)
- my_sheet.write(step,1,re_time)
- my_sheet.write(step,2,energy)
- my_sheet.write(step,3,unit)
- step += 1
- my_workbook.save(base_dir+"/handle/" + year +" cmep_to_excel.xls")
运行 handle 文件后,得到写入 Excel 文件的结果如下:
成功的写入了 Excel 文件,对于我们同事来说,这个是一个皆大欢喜的结果,但是他还需要进行数据处理,所以我们想,索性帮他用代码把数据处理也做了,最后我们就写了一个 result 的文件,把他想要的两个时间内的数据做差,然后再写入另一个 Excel 中,下面是代码:
- import xlrd,xlwt
- import os,sys
- base_dir = os.path.dirname(os.path.abspath(__file__))
- print(base_dir)
- sys.path.append(base_dir)
- file_list = os.listdir(base_dir+"/handle/")
- print(file_list)
- my_workbook = xlwt.Workbook()
- for filename in file_list:
- date,project = filename.split(" ")[0],filename.split(" ")[-1]
- if project == "cmep_to_excel.xls":
- myworkbook = xlrd.open_workbook((base_dir+"/handle/" + filename))
- i = 0
- o = 1
- while o < len(myworkbook.sheets()):
- frist_sheet = myworkbook.sheets()[i]
- second_sheet = myworkbook.sheets()[o]
- rows_num = second_sheet.nrows
- print(rows_num)
- my_sheet = my_workbook.add_sheet(frist_sheet.cell(0,0).value.split("_GHP_")[0])
- #在每个表单的头一行添加表头
- my_sheet.write(0,0,"数据类型")
- my_sheet.write(0,1,"日期")
- my_sheet.write(0,2,"数据")
- my_sheet.write(0,3,"单位")
- m = 1
- n = 0
- while n < rows_num:
- out_file = frist_sheet.cell(n,0).value
- re_time = frist_sheet.cell(n,1).value
- energy1 = float(frist_sheet.cell(n,2).value)
- unit = frist_sheet.cell(n,3).value
- energy2 = float(second_sheet.cell(n,2).value)
- energy_output = energy2 - energy1
- my_sheet.write(m,0,out_file)
- my_sheet.write(m,1,re_time)
- my_sheet.write(m,2,energy_output)
- my_sheet.write(m,3,unit)
- m +=1
- n +=1
- i += 2
- o += 2
- my_workbook.save(base_dir+"/handle/" + date + " result.xls")
最后得到他想要的结果文件,以后对于他这趟差事来说,那不是简单到没朋友,自己运行几个代码,所有的东西过程都不用管,结果就有了,大大提升了工作效率,为我们几个同事点一个赞。
其实还有一个弊端,也就是下次和老师碰的一个点,就是自己把几个模块,整合到一个 Python 文件中,自己运行一个文件,就把所有过程都跑完,也就是后面需要增加的内容。学习 Python 的时间还是有限,主要自己也不是干这个的,离自己理想还是有很大的差距,昨天晚上憋了 4 个小时,才把最后的 result 文件写玩,里面需要改进的地方还有很多,还需要努力。大家也跟一起努力把,你们的赞扬才是我努力的源泉,欢迎转发评论,欢迎批评指正。
来源: http://www.cnblogs.com/zpzcy/p/8097734.html