一个多月没写随笔了,主要是发的东西,自己感觉也很垃圾,说又说回来,谁不是从垃圾变强的,所以不比比,还得努力。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文件写玩,里面需要改进的地方还有很多,还需要努力。大家也跟一起努力把,你们的赞扬才是我努力的源泉,欢迎转发评论,欢迎批评指正。

近期对FTP及Excel数据处理的一些摸索的更多相关文章

  1. Excel与Word套打功能使用技巧及EXCEL数据处理成绩

    Excel与Word套打功能使用技巧 婚礼邀请友人参加,就需要写请柬.而且写请柬不但要求字写得端正,还不能有错别字,再加上邀请的朋友多,写请柬就是一个劳累活.这时我们利用Word的套打功能,就会让写请 ...

  2. Java对Excel数据处理(利用POI解析Excel)

    前言 研究生复试结束我在学校官网上看到了全校按姓氏排列的拟录取名单,但是官网并没有给出每个人的专业,只有学号,另外还知道本专业的复试名单,所以我想知道对于本专业的拟录取名单.具体做法就是,扫描复试名单 ...

  3. streamsets excel 数据处理

    streamsets 有一个directory的origin 可以方便的进行文件的处理,支持的格式也比较多,使用简单 pipeline flow 配置 excel 数据copy 因为使用的是容器,会有 ...

  4. 【Python】Excel数据处理

    1.环境准备 > python2.7 > xlrd,xlwt模块下载与安装,前者用来读取excel文件,后者用来写入excel文件 2.实战案例 案例场景: > excel1中包含某 ...

  5. [Python]-openpyxl模块Excel数据处理-读取公式的结果

    日常需要Python来处理各种数据,处理Excel数据常用的库一般有openpyxl.xlrd(读取).xlwt(写入). 经过对比发现openpyxl模块比较好用. openpyxl模块 这篇笔记比 ...

  6. excel数据处理,公式

    1. 替换 SUBSTITUTE(字符串, 原字符串, 新字符串) =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(L2,"镇",""),& ...

  7. pandas+mysql+excel 数据处理

    mysql  建表 join 建索引,不然查询慢 注意时间类型是否update后会被刷新 设计逻辑删除 enable   ,  不要delete null,字符串   数字运算用函数  ifnull( ...

  8. Excel数据处理

    合并计算: 数据面板下的合并计算 然后设置好合并计算的区域 以及勾选 首行跟最左列

  9. EXCEL数据处理-经纬度转换:度分秒转换为小数

    背景:工作中遇见此问题,整理了一下,花点时间随便总结下,希望能帮助到大家! 业务描述:红框内110°10′15"这种格式的经度,我想转换为110.36534这种格式. 步骤: 1.现将110 ...

随机推荐

  1. dubbo专题」dubbo其实很简单,就是一个远程服务调用的框架(1)

    一.dubbo是什么? 1)本质:一个Jar包,一个分布式框架,,一个远程服务调用的分布式框架. 既然是新手教学,肯定很多同学不明白什么是分布式和远程服务调用,为什么要分布式,为什么要远程调用.我简单 ...

  2. Django中ORM表的创建以及基本增删改查

    Django作为重量级的Python web框架,在做项目时肯定少不了与数据库打交道,编程人员对数据库的语法简单的还行,但过多的数据库语句不是编程人员的重点对象.因此用ORM来操作数据库相当快捷.今天 ...

  3. Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方案

    Eclipse Maven 开发一个 jee 项目时,编译时遇到以下错误:Description Resource Path Location TypeDynamic Web Module 3.0 r ...

  4. Tomcat部署项目乱码问题总结

    打包好的war包放在tomcat下,有时会出现中文乱码的情况.首先应当确定项目的编码格式,tomcat的编码格式,以及cmd命令行的编码格式. 项目编码 将要输出到控制台或日志的字符串转为UTF-8 ...

  5. C#提取字符串中的数字字符串

    1               }

  6. [转载] 运维角度浅谈:MySQL数据库优化

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 作者:zhenliang8,本文转自51CTO博客,http://lizhenliang. ...

  7. Python 日志处理(一) 按Nginx log_format 分割日志记录

    要求:不使用正则 根据nginx 默认的日志记录格式,分割日志记录. log_format main '$remote_addr - $remote_user [$time_local] " ...

  8. js中变量的作用域、变量提升、链式作用域结构

    一:作用域 在ES6之前,javascript没有块级作用域(一对{}即为一个块级作用域),只有全局作用域和函数作用域(局部),因此,对应的有全局变量和局部变量.在函数内部可以访问到全局变量,但在函数 ...

  9. MSSQL-并发控制-2-Isolation

              如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!   MySQL通过MVCC和锁来实现并发控制,在4 ...

  10. 撸起袖子加油干 golang入坑系列

    还是提醒一下,里面有段子,不都是技术. 冲着技术来的,慢走不送.没有版权,但可以给我发邮件(ztao8607@gmail.com) 在我的发小朋友中,终于最后一位打光棍的要结婚了. 说实话,真心不容易 ...