请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

新浪微博登陆

只需一步, 快速开始

QQ登录

只需一步,快速开始

搜索
查看: 434|回复: 3

[经验总结] 使用python脚本从ftp服务器下载文件

[复制链接] |关注本帖

新浪微博达人勋

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

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

x
最近下载数据的时候偶然找到的,分享出来,也算是多了一个方法。
脚本如下:

from ftplib import FTP
import sys
import os
import re

def ftpconnet(ftpserver,port,username,password):#连接ftp服务器
    ftp = FTP()
    try:
        ftp.connect(ftpserver,port)
    except:
        print('FTP connect failed!')

    try:
        ftp.login(username,password)
    except:
        print('FTP login failed!')
    else:
        return ftp

def ftpdownload(ftp,ori_path,dest_path):
    for each in ftp.nlst(ori_path):
        try:
            ftp.cwd(each)                                                   #检测该目录是否还含有下级目录,若有,将该路径设为新路径重复操作
        except:
            filename = re.search('\S+\/(\S+)',each).group(1) #获取文件名,这是将each与【一个或多个非空字符+\+(一个或多个非空字符)】的形式                                                                                       #匹配并返回括号内形式的内容,search只返回第一个符合的结果
            local_file = dest_path + '/' + filename
            if os.path.exists(local_file):
                lsize = os.stat(local_file).st_size
                rsize = ftp.size(each)
                if lsize > rsize:
                    sys.stderr.write('the local file %s is bigger than the remote!\n'%local_file)
                    return False
                elif lsize == rsize:
                    sys.stderr.write('the file %s has been completed!\n'%local_file)
                bufsize = 1024 * 1024
                fp = open(local_file,'ab')
                ftp.retrbinary('RETR '+each,fp.write,bufsize,rest=lsize)
            else:
                bufsize = 1024 * 1024
                fp = open(local_file,'wb')
                ftp.retrbinary('RETR '+each,fp.write,bufsize)
        else:
            dirname = re.search('\S+\/(\S+)',each).group(1) #当检测到还有下级目录时也创建相应的目录
            dirname = dest_path + '/' + dirname + '/'
            os.system('mkdir -p %s'%dirname)
            ftpdownload(ftp,each,dirname)

def ftpclose(ftp):
    ftp.quit()

if __name__ == '__main__':
    ftp = ftpconnet('eclipse.ncdc.noaa.gov',21,'','')
    ftpdownload(ftp,'/pub/ibtracs/v03r10/ibtracs/',r'noaa\all_strom') #样例是下载noaa的风暴路径数据
    ftpclose(ftp)
密码修改失败请联系qq:937062711

新浪微博达人勋

发表于 2018-7-12 21:29:46 | 显示全部楼层 |取消关注该作者的回复
楼主在吗 想问下 如果想用这个方法下载ftp下带有某个字段的指定文件可以实现吗  
密码修改失败请联系qq:937062711

新浪微博达人勋

 楼主| 发表于 2018-7-12 23:35:12 | 显示全部楼层 |取消关注该作者的回复
mao123 发表于 2018-7-12 21:29
楼主在吗 想问下 如果想用这个方法下载ftp下带有某个字段的指定文件可以实现吗

应该可以 至少在获取filename之后可以再用一次正则表达式判断是否含有制定字段
密码修改失败请联系qq:937062711

新浪微博达人勋

 楼主| 发表于 2018-7-12 23:43:49 | 显示全部楼层 |取消关注该作者的回复
本帖最后由 我不知道叫什么 于 2018-7-13 09:43 编辑

今天用python画图的时候感觉colorbar不太够用,翻来翻去发现这里有很多的colorbar可以用。
参考站内的帖子和网络上的资源写了扒colorbar的脚本……

先从网站上扒rgb文件:
import requests
import re
save_path=r'××××××××'
url = 'http://www.ncl.ucar.edu/Document/Graphics/ColorTables/Files/'
html=requests.get(url)
source=html.text
allrgb=re.findall('href="\S+.rgb"',source,re.S)
for each in allrgb:
    rgb=re.search('href="(\S+)"',each).group(1)
    link=(url+rgb)
    r=requests.get(link)
    with open(save_path+'\\'+rgb,'wb') as fl:
        fl.write(r.content)

然后从rgb文件做matplotlib用的colormap:

def getcolorbar(name=None):
    from demo_function import Reader
    import matplotlib.colors as col
    if name == None:
        name = 'BlGrYeOrReVi200'
    path=r'colormap\\'
    fl=Reader(path+name+'.rgb',['r','g','b'],number=3)#http://www.ncl.ucar.edu/Document/Graphics/ColorTables/BlGrYeOrReVi200.shtml
    rgb=fl.spliter()
    #print(rgb)
    num=len(rgb['r'])
    #print(num)
    cdict={
        'red':[],
        'green':[],
        'blue':[],
            }
    for i in range(0,num):
        cdict['red'].append((i/(num-1),rgb['r']/255,rgb['r']/255))
        cdict['green'].append((i/(num-1),rgb['g']/255,rgb['g']/255))
        cdict['blue'].append((i/(num-1),rgb['b']/255,rgb['b']/255))
    #print(cdict)
    my_cmap = col.LinearSegmentedColormap(name='newcmap',segmentdata = cdict,N=256)
    return my_cmap

因为懒,所以做了一个默认。然后cdict做的时候原理上可能有点问题,首尾正经应该添一个(0,0,0)和(1,1,1)来着。
密码修改失败请联系qq:937062711
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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