【发布时间】:2015-02-07 19:00:03
【问题描述】:
我正在尝试从 FTP 服务器下载某个文件(名为 010010-99999-year.gz)。这个相同的文件,但不同年份驻留在不同的 FTP 目录中。例如:
ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-lite/2000/010010-99999-1973.gz ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-lite/2001/010010-99999-1974.gz 等等。图片说明了其中一个目录:
该文件并非位于所有目录中(即所有年份)。在这种情况下,我希望脚本忽略丢失的文件,打印“不可用”,然后继续下一个目录(即明年)。 我可以使用 NLST 列表来执行此操作,方法是首先在当前 FTP 目录中生成文件列表,然后检查我的文件是否在该列表中,但这很慢,并且 NOAA(拥有服务器的组织)不喜欢文件列表(source)。因此我想出了这个代码:
def FtpDownloader2(url="ftp.ncdc.noaa.gov"):
ftp=FTP(url)
ftp.login()
for year in range(1901,2015):
ftp.cwd("/pub/data/noaa/isd-lite")
ftp.cwd(str(year))
fullStationId="010010-99999-%s.gz" % year
try:
file=open(fullStationId,"wb")
ftp.retrbinary('RETR %s' % fullStationId, file.write)
print("File is available")
file.close()
except:
print("File not available")
ftp.close()
这会正确下载现有文件(1973-2014 年),但也会生成 1901-1972 年的空文件。该文件不在 1901-1972 的 FTP 中。 我在使用 try 和 except 时做错了什么,还是其他问题?
【问题讨论】:
-
@alfasin 可能的重复问题是关于检查本地是否存在文件。我的问题是如果 FTP 服务器中不存在文件,则继续循环。
-
对不起,我的错。您应该检查 FTP 服务器上的文件大小,如果大小 > 0 它存在。示例:example-code.com/python/ftp_fileExists.asp
标签: python ftp ftplib try-except