import os import ftplib import time # 这个函数用于将日期从整型转为FTP路径所需的字符串 def getDateStr(yearNum, monNum, dayNum): # 四位数年份 yearStr = str(yearNum) # 两位数月份 if monNum < 10: monStr = "0" + str(monNum) else: monStr = str(monNum) # 两位数天 if dayNum < 10: dayStr = "0" + str(dayNum) else: dayStr = str(dayNum) return yearStr, monStr, dayStr # 这个函数用于获取前一天的日期号 def getYesterday(year, month, day): if day == 1: if month == 1: year -= 1 month = 12 day = 31 elif month == 2 or month == 4 or month == 6 or month == 8 or month == 9 or month == 11: month -= 1 day = 31 elif month == 5 or month == 7 or month == 10 or month == 12: month -= 1 day = 30 elif month == 3: # 闰年 if year % 4 == 0 and year % 400 == 0: day = 29 month -= 1 # 闰年 elif year % 4 == 0 and year % 100 != 0: day = 29 month -= 1 else: day = 28 month -= 1 else: day -= 1 return year, month, day # 获取文件后缀名 def suffix(file, *suffixName): array = map(file.endswith, suffixName) if True in array: return True else: return False # 删除目录下扩展名为.temp的文件temp的文件 def deleteFile(fileDir, suf='.temp'): targetDir = fileDir for file in os.listdir(targetDir): targetFile = os.path.join(targetDir, file) if suffix(file, suf): os.remove(targetFile) class myFTP: ftp = ftplib.FTP() # 连接FTP,host是IP地址,port是端口,默认21 def __init__(self, host, port=21, YesdayNum=1): self.ftp.connect(host, port) self._dayNum = YesdayNum # 登录FTP连接,user是用户名,password是密码 def Login(self, user, password): self.ftp.login(user, password) print(self.ftp.welcome) # 显示登录信息 # 下载单个文件,LocalFile表示本地存储路径和文件名,RemoteFile是FTP路径和文件名 def DownLoadFile(self, LocalFile, RemoteFile): bufSize = 102400 file_handler = open(LocalFile, 'wb') print(file_handler) # 接收服务器上文件并写入本地文件 self.ftp.retrbinary('RETR ' + RemoteFile, file_handler.write, bufSize) self.ftp.set_debuglevel(0) file_handler.close() return True # 下载整个目录下的文件,LocalDir表示本地存储路径, emoteDir表示FTP路径 def DownLoadFileTree(self, LocalDir, RemoteDir, choice): # print("remoteDir:", RemoteDir) # 如果本地不存在该路径,则创建 if not os.path.exists(LocalDir): os.makedirs(LocalDir) # 获取FTP路径下的全部文件名,以列表存储 # 好像是乱序 self.ftp.cwd(RemoteDir) RemoteNames = self.ftp.nlst() RemoteNames.reverse() # print("RemoteNames:", RemoteNames) for file in RemoteNames: # 先下载为临时文件Local,下载完成后再改名为nc4格式的文件 # 这是为了防止上一次下载中断后,最后一个下载的文件未下载完整,而再开始下载时,程序会识别为已经下载完成 Local = os.path.join(LocalDir, file[0:-3] + ".temp") LocalNew = os.path.join(LocalDir, file) ''' 下载小时文件,只下载UTC时间1时至10时(北京时间9时至18时)的文件 下载的文件必须是nc格式 若已经存在,则跳过下载 ''' # 小时数据命名格式示例:H08_20200819_0700_1HARP030_FLDK.02401_02401.nc if choice == 1: if (int(file[13:15]) >= 0 and int(file[13:15]) <= 12) or (int(file[13:15]) >= 21): if not os.path.exists(LocalNew): print("Downloading the file of %s" % file) self.DownLoadFile(Local, file) os.rename(Local, LocalNew) print("The download of the file of %s has finished\n" % file) elif os.path.exists(LocalNew): print("The file of %s has already existed!\n" % file) else: pass # 天数据命名格式示例:H08_20200802_0000_1DARP030_FLDK.02401_02401.nc elif choice == 2: if int(file[10:12]) == self._dayNum and not os.path.exists(LocalNew): print("Downloading the file of %s" % file) self.DownLoadFile(Local, file) os.rename(Local, LocalNew) print("The download of the file of %s has finished\n" % file) elif int(file[10:12]) == self._dayNum and os.path.exists(LocalNew): print("The file of %s has already existed!" % file) elif choice == 3: # 分钟级别的数据已经明确了小时关系,所以不需要根据小时筛选 if not os.path.exists(LocalNew) and '02401_02401' in file: print("Downloading the file of %s" % file) self.DownLoadFile(Local, file) os.rename(Local, LocalNew) print("The download of the file of %s has finished\n" % file) elif os.path.exists(LocalNew): print("The file of %s has already existed!\n" % file) else: pass self.ftp.cwd("..") return def close(self): self.ftp.quit()