168 lines
5.7 KiB
Python
168 lines
5.7 KiB
Python
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() |