爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 20077|回复: 7

[源代码] python之FTP数据传输实例

[复制链接]

新浪微博达人勋

发表于 2020-12-22 14:16:34 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2020-12-22 14:51 编辑

一、需求缘起
平时的工作,需要从局域网的服务器上拷数据,程序员让我们使用XFTP软件拷贝:
xftp软件图标.jpg
1849619350.jpg 1518903332.jpg


该软件速度慢,传输时间长了会卡死,设置的灵活性也差,
几个月下来,逐渐没有了耐心。

二、另辟蹊径
我也尝试了其他数据传输工具,
FTP Voyager软件,或者通过网页访问FTP,
经亲测,容易出现卡死现象,还不如XFTP软件
于是,我从上周开始研究,如何编程实现FTP数据传输。

三、山重水复疑无路
从网上抄的代码,没运行成功,我发了个求助帖子:
[求助] python之FTP传输失败:目标计算机积极拒绝
不知问题出在哪,我合计着------
被服务器限制了?我司做软件没那么专业,可能性不大
python包的版本不对?......

四、柳暗花明又一村
昨天我又重找了案例看,研究了一下午,改好了几个bug,最后居然成功了:
使用python操作FTP上传和下载
(源代码详解见下一楼)

五、新工具带来新景象
直接用FTP编程来传输数据,主动权都在自己手中,优势如下:
1、稳定:出现网络问题可设置自动重连和程序恢复,不会像XFTP软件那样卡死后永远不动;
2、加速:可自行设置多线程传输,加快速度
3、直接检查服务器端数据:比如数据是否出现显著缺失,可以用来提供报警,也可以省去不必要的文件传输
4、灵活的选择性拷贝:可实现【隔N组拷贝】、【按早晚时间拷贝】等特殊拷贝方式,减少不必要的数据传输量
5、自动拷贝与自动数据分析结合,实现一条龙

六、心得
使用python,包多的是,一个不行就换另一个,不需要在一个上面钻牛角尖,
之前我处理shp数据时,发现pyshp包不好使,换成Fiona包就很顺利:
IDL/ENVI+python+shp之获取行政区边界案例

寓言故事:玻璃瓶中的苍蝇和蜜蜂

一位科学家曾做过这样一个实验:把几只蜜蜂放在瓶口敞开的瓶子里,侧放瓶子,瓶底向光,蜜蜂会一次一次地飞向瓶底,企图飞进光源。它们决不会反其道而行,试试另一个方向。困在瓶中对它们来说是一个全新的情况,是它们生理结构所始料未及的,因此,它们无法适应改变后的环境。这位科学家又做了一次实验,这次瓶子里放的是几只苍蝇,瓶底向光,不到几分钟,几只苍蝇都飞出去了。它们多方尝试——向上、向下、面光、背光。它们常会一头撞上玻璃,但最后会振翅飞向瓶颈,飞出瓶口。然后,科学家解释这个现象说:“横冲直撞要比坐以待毙高明得多。”

评分

参与人数 1金钱 +1 收起 理由
梦纯 + 1 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-12-22 14:34:49 | 显示全部楼层
源代码与注释

以下红色为关键注释,蓝色为次要注释

import os.path
from ftplib import FTP
import time
time_start=time.time() #记录程序开始时间
ftp=FTP()

ftp.connect("10.20.30.4",12345) #ftp服务器的IP和端口,按自己的填写
ftp.login("user","password") #连接的用户名,密码


curfold="/烟台/H_Scan" #远程目录
ftp.cwd(curfold) #进入远程目录


#ftp.dir打印的结果中含有文件夹名结果保存在临时变量x中
x=[]
ftp.dir('.',x.append)


#从x的每个字符串中提取子文件夹名,保存在sonfolds中:
sonfolds=[]
for i in x:
    cut=i.split(' ')
    sonfolds.append(cut[-1])
del x


goodfolds=[] #所需的子文件夹名


for i in sonfolds:
    if i.startswith('202011') and i.endswith('P'): #筛选子文件夹,这里需要2020年11月的数据
        goodfolds.append(i)


n=len(goodfolds)
print('文件夹数=',n)
for i in range(n):
    goodfold=goodfolds
    #进入该文件夹
    ftp.cwd(curfold+'/'+goodfold)
   
    #获取当期目录内的文件名
    files=ftp.nlst()
    print('文件数=',len(files))
   
    bufsize=1024 #设置的缓冲区大小
   
    #准备把下载的文件存放于本地目录
    PcFold=r'G:\烟台\H_Scan'+'\\'+goodfold
   
    #新建不存在的目录:
    if not os.path.isdir(PcFold):
        os.makedirs(PcFold) #该函数可新建多级目录
   
    #把文件逐个传输到本地:
    for file1 in files[0:1]: #先传1个试试
        if os.path.isfile(PcFold+'\\'+file1):
            print('文件已存在')
            continue
        #以写模式在本地打开文件:
        file_handle=open(PcFold+'\\'+file1,"wb").write
        #接收服务器上文件并写入本地文件:
        ftp.retrbinary('RETR '+file1,file_handle,bufsize)
   
    print('已拷贝进度:',i+1,'/',n)


ftp.quit() #退出ftp
time_end=time.time()#记录程序结束时间
print('程序耗时=',time_end-time_start)

密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-22 14:43:38 | 显示全部楼层
调整编码

以上代码可能出现乱码或报错,
ftplib包的源代码文件ftplib.py使用latin-1编码,不知道这个编码有什么用处,
修改为utf-8就好了:

ftplib.jpg


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-23 10:20:05 | 显示全部楼层
{:5_213:}很棒
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-25 14:59:12 | 显示全部楼层
多进程FTP


使用三楼的代码传输数据,速度比较慢,感觉约每秒3个文件,
于是加了多进程,由于是用服务器,设置比较大胆,400~800个进程同时走,每秒200个文件

Python之进程的学习


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-26 18:46:27 | 显示全部楼层
谢谢,非常有用。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-31 11:02:45 | 显示全部楼层
附件:Serv-U的使用

感觉这个下载文件还没XFTP好使

1、地址栏是服务器IP,输入账号密码登录:
603170435.jpg
2、选择网页版:
360截图20201231104636196.jpg
3、无法下_载文件夹:
658688327.jpg
4、只能下载文件:
1699605288.jpg





密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-2-9 11:07:14 | 显示全部楼层
非常好,收藏了,谢谢分享。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表