文章目录

  • 前言
  • 需求梳理
  • 1、数据处理
    • 原始数据长啥样?
    • 筛选既定条件数据
    • 选择需要用到的列
    • 处理过程封装待用
  • 2、确定文件及目录
  • 3、连接FTP
  • 4、批量下载文件
  • 5、处理文件
  • 6、最后,让脚本运行起来

前言

有个小姐姐要从历史数据日志里根据一定的规则筛选一批数据,这批数据中有对局战场id字段,再根据这些id转化为文件名,连接远程FTP搜索该文件并下载到本地,然后打开文件删除前5行并在第6行行首添加一个字母,最后将改文件后缀名修改。 一天处理50+个这样的文件转化需求,简单算了下,差不多刚好要一天时间吧!!
但是,这怎么可以!!!!!!
于是,我主动提出了救援支持,结果就是现在基本上10分钟以内可以搞定以上操作!!

需求梳理

①数据处理:按照一定规则从历史数据日志筛选一批数据
②确定文件及目录:根据一定规则确定文件名及所在FTP子目录(远程FTP按照日期建子目录存储的文件)
③连接FTP:连接远程FTP
④批量下载文件:依据②中文件名及目录循环切换FTP远程目录并下载文件
⑤处理文件:打开文件并删除前5行 在文件第6行行首添加字母,保存时修改文件后缀(格式)

1、数据处理

历史数据日志有多份,存放在同一个文件夹,文件格式是csv
使用pandas进行数据处理操作
处理步骤:

  • 读取数据合并的时候同步按照既定条件进行数据筛选
  • 选择需要用到的字段

原始数据长啥样?

pandas.csv()读取数据后,我们使用info可以发现原始日志包含了71个字段,同时单个文件200MB+38万条数据。。

>>>df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 386418 entries, 0 to 386417
Data columns (total 71 columns):#   Column                   Non-Null Count   Dtype
---  ------                   --------------   -----  0   @timestamp               386418 non-null  object 1   appid                    386418 non-null  int64  2   assist                   386418 non-null  int64  3   battle_sum               386418 non-null  int64  4   battleid                 386418 non-null  int64
...69  usernum                  386418 non-null  int64  70  victory                  386418 non-null  int64
dtypes: float64(7), int64(54), object(10)
memory usage: 209.3+ MB

筛选既定条件数据

考虑到我们一次性处理的文件数不止一个,所以在读取原始日志后可以先把条件筛选工作做了再合并。
处理完之后,我们发现文件大小降低为7.9KB,很轻松的感觉有木有~

>>>df = df[df['modetid']>=117 ]
>>>df = df[df['usernum']>=10 ]
>>>df = df[df['pentakill']>=1 ]
>>>df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 14 entries, 117184 to 384421
Data columns (total 71 columns):#   Column                   Non-Null Count  Dtype
---  ------                   --------------  -----  0   @timestamp               14 non-null     object 1   appid                    14 non-null     int64  2   assist                   14 non-null     int64  3   battle_sum               14 non-null     int64  4   battleid                 14 non-null     int64  ...69  usernum                  14 non-null     int64  70  victory                  14 non-null     int64
dtypes: float64(7), int64(54), object(10)
memory usage: 7.9+ KB

选择需要用到的列

实际上我们在后续处理中需要用到的列比较少,咱们一并处理了吧

>>>df = df[['@timestamp','battleid','herotid','quadrakill','pentakill']]
>>>df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 14 entries, 117184 to 384421
Data columns (total 5 columns):#   Column      Non-Null Count  Dtype
---  ------      --------------  ----- 0   @timestamp  14 non-null     object1   battleid    14 non-null     int64 2   herotid     14 non-null     int64 3   quadrakill  14 non-null     int64 4   pentakill   14 non-null     int64
dtypes: int64(4), object(1)
memory usage: 672.0+ bytes

处理过程封装待用

由于合并多文件的操作在此前介绍过,这里不做更多科普,有兴趣同学可以前往查阅
以下是全部代码:

import os
import pandas as pd
import timedef concatData():start_time = time.perf_counter()print('正在读取原始对局日志......')location = './对局日志'fileList = []n = 0#合并数据for fileName in os.walk(location):for table in fileName[2]:path = fileName[0] + '/' +tableLi = pd.read_csv(path,header=0)#通过指定规则筛选数据Li = Li[Li['modetid']>=117 ]Li = Li[Li['usernum']>=10 ]Li = Li[Li['pentakill']>=1 ]n = n+1fileList.append(Li)print('第'+str(n)+'个表格已经合并')print('在该目录下有%d个文件'%len(fileList))print('正在合并,请稍等......')res = pd.concat(fileList,ignore_index = True)print('合并完成......')#选择需要用到的字段res = res[['@timestamp','battleid','herotid','quadrakill','pentakill']]use_time = time.perf_counter() - start_timeprint('合并数据消耗时长:{0:.2f} 秒\n'.format(use_time))return res

2、确定文件及目录

在上一步数据处理后,我们得到的数据长下面这样:

>>>df.head() @timestamp      battleid  herotid  quadrakill  pentakill
117184  2020-05-27 13:05:11  110853427027       14           0          1
130197  2020-05-27 13:49:10  110853428327       27           0          1
151473  2020-05-27 15:18:37  110853430538       17           0          1
185862  2020-05-27 17:39:53  110853434015       14           0          1
194350  2020-05-27 18:01:38  110853434646       22           0          1

在远程FTP里文件存储在二级目录里,二级目录是以日期命令,在历史数据日志里有每个对局发生的时间,因此可以通过这些字段行程 改文件及所在目录关系。

由于时间字段@timestamp是object格式,且形如“2020-05-27 13:05:11”,我们直接采用字符串的**split()**方法即可获得日期目录。

df['@timestamp'] = df['@timestamp'].str.split(' ').str[0]

文件格式为str(df.iloc[i][1])+’.bd’

3、连接FTP

Python中默认安装的ftplib模块,常见的函数列举如下:
参考文档:https://docs.python.org/3/library/ftplib.html

 **ftp登录连接**
from ftplib import FTP            #加载ftp模块
ftp=FTP()                         #设置变量
ftp.set_debuglevel(2)             #打开调试级别2,显示详细信息
ftp.connect("IP","port")          #连接的ftp sever和端口
ftp.login("user","password")      #连接的用户名,密码
print ftp.getwelcome()            #打印出欢迎信息
ftp.cmd("xxx/xxx")                #进入远程目录
bufsize=1024                      #设置的缓冲区大小
filename="filename.txt"           #需要下载的文件
file_handle=open(filename,"wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0)             #关闭调试模式
ftp.quit()                        #退出ftp
**ftp相关命令操作**
ftp.cwd(pathname)                 #设置FTP当前操作的路径
ftp.dir()                         #显示目录下所有目录信息
ftp.nlst()                        #获取目录下的文件
ftp.mkd(pathname)                 #新建远程目录
ftp.pwd()                         #返回当前所在位置
ftp.rmd(dirname)                  #删除远程目录
ftp.delete(filename)              #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize)  #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)  #下载FTP文件

获取远程FTP地址端口及账号密码后,即可进行连接

from ftplib import FTPdef ftpConnect():#实例化一个fto对象ftp =FTP()#ftp地址及账号密码host = 'xxx'port = xxxuser_name = 'xxx'password = 'xxx'#连接ftpftp.connect(host ,port)ftp.login(user_name,password)#打印欢迎消息print (ftp.getwelcome())#设置被动模式(0是主动,1是被动)ftp.set_pasv(1)print('ftp连接成功\n')return ftp

4、批量下载文件

下载文件前需要先切换到该文件所在的文件目录,然后再进行文件下载
切换文件目录:ftp.cwd(pathname) #设置FTP当前操作的路径
下载文件:ftp.retrbinary(“RETR filename.txt”,file_handel,bufsize) ,filename.txt是我们需要下载的文件
下载文件前先以写模式在本地打开文件file_handle=open(filename,“wb”).write

def ftpDownload(ftp,df):#df存放需要下载的文件及其所在目录start_time = time.perf_counter()n = 0m = 0print('正在下载文件')for i in range(len(df.index)):#获取文件所在目录pathname = df.iloc[i][0]#切换到文件所在目录ftp.cwd(pathname)#打印一级文件目录#files = ftp.dir()#获取目录下的所有文件#file_list = ftp.nlst()#设置本文件下载存储所在路径(./是当前文件所在路径)local_path="./录像源文件/"#为准备下载到本地的文件,创建文件对象remote_file_name = str(df.iloc[i][1]) +'.bd'try:local_file_name=local_path + os.path.basename(remote_file_name)file = open(local_file_name, 'wb')#从FTP服务器下载文件到前一步创建的文件对象,其中写对象为file.write,1024是缓冲区大小  ftp.retrbinary('RETR '+remote_file_name,file.write,1024)  #关闭下载到本地的文件  file.close()except :m = m+1print(f'\r共{m}个文件下载失败,共{n}个文件下载完成',end = ' ')else:n = n+1print(f"\r共{m}个文件下载失败,共{n}个文件下载完成",end = ' ')ftp.cwd('/')    #关闭FTP客户端连接ftp.close()print(f'\n共{n}个有效对局文件~')print('\nftp连接已关闭')use_time = time.perf_counter() - start_timeprint('FTP数据下载消耗时长:{0:.2f} 秒\n'.format(use_time))

5、处理文件

由于需要处理的文件是字符串类型是bytes,在打开的时候需要用“rb”,删除前5行简单用del即可
在第六行行首写入字符时,需要注意以b作为前缀

def fileHandle(df):print('正在进行数据转化')m= 0n= 0for i in range(len(df.index)):try:refile = './录像源文件/' + str(df.iloc[i][1]) + '.bd'fre = open(refile,'rb')a = fre.readlines()fre.close()del a[0:5]wrfile = './录像可执行文件/' + f'{str(i)}-' + df.iloc[i][5]+'五杀'+'.rep'           fwr = open(wrfile, 'wb')a[0]=  b'$'+a[0] fwr.writelines(a)fwr.close()except :m = m+1print(f'\r共{m}个文件转化失败,共{n}个文件转化完成',end = ' ')else:n = n+1print(f"\r共{m}个文件转化失败,共{n}个文件转化完成",end = ' ')

6、最后,让脚本运行起来

没啥别的,一步一步走,我们发现执行效率还蛮高的
中间遇到过 "error_perm:550 Failed to open file. "的问题,后来发现是远程文件目录不对或者本地文件没有读写权限导致的。

if __name__ == '__main__':starttime = time.perf_counter()#合并数据并过滤res = concatData()#关联英雄名称并处理日期与ftp目录一致#df = mergeData(res)#登录ftpftp = ftpConnect()#下载指定文件ftpDownload(ftp,df)#转化数据为可播放文件fileHandle(df)usetime = time.perf_counter() - starttimeprint('\n本次累积消耗时长:{0:.2f} 秒\n'.format(usetime))

人工处理可能需要一天时间,脚本执行只用了不到7分钟!!

>>>runfile('D:/ftp资源下载/ftp批量下载文件.py', wdir='D:/ftp资源下载')
正在读取原始对局日志......
第1个表格已经合并
第2个表格已经合并
第3个表格已经合并
在该目录下有3个文件
正在合并,请稍等......
合并完成......
合并数据消耗时长:10.29 秒一共81个可用对局文件
220 (vsFTPd 3.0.2)
ftp连接成功正在下载文件
共18个文件下载失败,共63个文件下载完成
共63个有效对局文件~ftp连接已关闭
FTP数据下载消耗时长:395.89 秒正在进行数据转化
共18个文件转化失败,共63个文件转化完成
本次累积消耗时长:407.21 秒

实践应用|Python自动化连接FTP批量下载指定文件相关推荐

  1. linux脚本定时拷贝文件,使用Linux shell脚本实现FTP定时执行批量下载指定文件

    使用FTP定时批量下载指定文件的shell脚本,具体实例介绍如下所示: 1.目标FTP服务器地址 #FTP服务器地址 ip=10.19.15.23 2.FTP账号和密码 u=账号 p=密码 3.使用m ...

  2. C# 从FTP上下载指定文件到本机

    1 #region 下载 2 private void btnDownload_Click(object sender, EventArgs e) 3 { 4 5 WebClient webClint ...

  3. Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理

    Python 连接 FTP 服务器并实现文件夹下载实例演示 第一章:连接 FTP 服务器并实现文件夹下载 ① 连接 FTP 服务器 ② 进入指定目录并显示文件信息 ③ 区分文件和文件夹名 ④ 文件夹名 ...

  4. 手把手教你用Python打造一款批量下载视频并能可视化显示下载进度的下载器

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 桃之夭夭,灼灼其华. /1 前言/ ...

  5. 手把手教你用Python打造一款批量下载视频并能可视化显示下载!

    /1 前言/ 平时宅在家的我们最爱做的事莫过于追剧了,但是有时候了,网络原因,可能会让你无网可上.这个时候那些好看的电视剧和电影自然是无法观看了,本期我们要讲的就是怎样下载这些视频. /2 项目目标/ ...

  6. 2021-03-10 Python多线程爬虫快速批量下载图片

    Python多线程爬虫快速批量下载图片 1.完成这个需要导入的模块 urllib,random,queue(队列),threading,time,os,json 第三方模块的安装 键盘win+R,输入 ...

  7. python批量下载网页文件夹_Python实现批量从不同的Linux服务器下载文件

    基于Python实现批量从不同的Linux服务器下载文件 by:授客 实现功能 批量从不同的Linux服务器下载指定文件 测试环境 Win7 64位 Python 3.3.2 pscp 64位 下载地 ...

  8. python写的一个-批量下载股票年报的小工具

    python写的一个-批量下载股票年报的小工具 from urllib import request import requests import os import openpyxl# print( ...

  9. Python爬虫——利用Scrapy批量下载图片

    Python爬虫--利用Scrapy批量下载图片 Scrapy下载图片项目介绍 使用Scrapy下载图片 项目创建 项目预览 创建爬虫文件 项目组件介绍 Scrapy爬虫流程介绍 页面结构分析 定义I ...

  10. python爬虫+ffmpeg批量下载ts文件,解密合并成mp4

    标题 python爬虫+ffmpeg批量下载ts文件,解密合并成mp4 文章目录 标题 前言 一.分析目标 二.寻找url规律 三.写代码 总结 前言 (第一次写博客,写的不好请见谅哈~~) 目标是大 ...

最新文章

  1. 如何 添加 implementation_如何用序列分类方式进行法律要素与当事人关联性分析 | 机器之心...
  2. 【知识星球】这几年人脸都有哪些有意思的数据集?
  3. Linux系统中查看图片信息
  4. sqoop数据倾斜_北京卓越讯通大数据岗位面试题分享
  5. linux 串口 qt,Linux-QT4.7 实现串口通信
  6. 云星空计算机名访问不可以,03.PLM系统访问金蝶云星空(webapi):读取基础资料编码、名称...
  7. Linux. C语言中else,if else用法详解,C语言if else用法完全攻略
  8. 单片机ADC采样算法----限幅平均滤波法
  9. dbscan js 实现_DBSCAN在PySpark上的实现
  10. springboot中得注解_SpringBoot 中的基本注解
  11. Designing With Web Standard(一)
  12. Android sdk 环境变量配置无效
  13. 支持断电保护的FAT文件系统
  14. 手把手教你进行腾讯云域名注册
  15. CentOS7系统清理缓存数据命令
  16. 【高等数学】无穷数级
  17. 【爬虫】 Squid 3.5.20 安装与配置 高匿代理
  18. 图像的直方图计算及绘制(红绿蓝三通道直方图)
  19. 回味那些评论有时候也能受教--摘自双鱼座ROM之硬件评论
  20. 使用Excel VBA制作成绩统计图----(嵌入模式)

热门文章

  1. 字节序转换IP地址转换接口
  2. Orcad CIS本地库添加器件
  3. 《多媒体技术与应用》练习题
  4. JavaScript高级程序设计(第三版)阅读笔记
  5. MapGuide 安装
  6. mysql executereader_ExecuteReader的用法
  7. 转载 DOS/BAT批处理if exist else 语句的几种用法
  8. 用友 U9好不好???
  9. 纯真数据库 解析 php,PHP解析纯真IP数据库(qqwry.dat)
  10. 连接局域网中计算机与传输介质的网络设备是,连接局域网中的计算机与传输介质的网络连接设备是。...