0

クラス インスタンスが呼び出されたときにファイル名の一部を指定して、ftp サイト ( ftp://ladsweb.nascom.nasa.gov/allData/5/MOD11A1/ ) から 1 つのファイルをダウンロードするクラスを作成しました。後で for ループを作成し、クラス インスタンスを for ループ内に統合して、日付の範囲内にある複数のファイルをダウンロードできるようにしました。ファイルは作成された日付に従って名前が付けられているため、これは日付の範囲です。だから、毎日のファイルがあります。コードを実行すると、日付の範囲を入力するよう求められます。範囲の最初のファイルは正常にダウンロードされますが、プログラムが停止して次のエラーが出力されます。

Traceback (most recent call last):
      File "ftplib04Simplified.py", line 42, in <module>
        FtpDownloader("ladsweb.nascom.nasa.gov","/allData/5/MOD11A1/",a).findFile(10,11)
      File "ftplib04Simplified.py", line 32, in findFile
        self.ftp.retrbinary('RETR %s' % filename, open(filename,'wb').write)
      File "/usr/lib/python3.3/ftplib.py", line 424, in retrbinary
        with self.transfercmd(cmd, rest) as conn:
      File "/usr/lib/python3.3/ftplib.py", line 386, in transfercmd
        return self.ntransfercmd(cmd, rest)[0]
      File "/usr/lib/python3.3/ftplib.py", line 352, in ntransfercmd
        resp = self.sendcmd(cmd)
      File "/usr/lib/python3.3/ftplib.py", line 259, in sendcmd
        return self.getresp()
      File "/usr/lib/python3.3/ftplib.py", line 233, in getresp
        raise error_perm(resp)
    ftplib.error_perm: 550 No such file.

    shell returned 1

純粋なクラス設計に恥をかくことは承知していますが、これが私が書いた完全なコードです: PS これは Python 3 で書かれました。コードを実行する場合、入力を求められたときに 2001 年以降の日付を入力してください。

import ftplib
import math
import datetime as dt
import time
class FtpDownloader:
    """Downloads raster tiles given the date, and tile row and column number"""
    def __init__(self,site,directory,raw_date,ftp=None):
        """logs in to ftp"""
        self.site=site
        self.directory=directory
        self.raw_date=raw_date
        self.ftp=ftplib.FTP(site)
        self.ftp.login()
        self.convert_date()
    def convert_date(self):
        """converts YYYY-MM-DD format to year and day of the year"""
        year=self.raw_date.strftime("%Y")
        day=self.raw_date.strftime("%j")
        self.go_to_folder(year,day)
    def go_to_folder(self,year,day):
        """sets the current FTP directory"""
        self.ftp.cwd(self.directory+"%s/%s/" % (year,day))
    def findFile(self,h,v,fileList=[]):
        """checks for the file containing the given h and h and downloads it using retrbinary"""
        hh= "%02d" % h
        vv= "%02d" % v
        tilename = "h%sv%s" % (hh,vv)
        print ("Image tile %s is downloading..." % tilename)
        self.ftp.retrlines('NLST',fileList.append)
        for filename in fileList:
            if tilename in filename:
                self.ftp.retrbinary('RETR %s' % filename, open(filename,'wb').write)
                print ("File downloaded")
                break
        else:
            print (filename, "not found")
        self.ftp.close()
start=dt.datetime.strptime(input("Enter a start date in YYYY-MM-DD format "),"%Y-%m-%d")
end=dt.datetime.strptime(input("Enter an end date in YYYY-MM-DD format "),"%Y-%m-%d")
for i in range((end-start).days + 1):
    a=(start+dt.timedelta(days=i)).date()
    FtpDownloader("ladsweb.nascom.nasa.gov","/allData/5/MOD11A1/",a).findFile(10,11)
4

1 に答える 1

-1

break最初のファイルをダウンロードするとすぐに、ダウンロード ループから抜け出します。

def findFile(self,h,v,fileList=[]):
    """checks for the file containing the given h and h and downloads it using retrbinary"""
    hh= "%02d" % h
    vv= "%02d" % v
    tilename = "h%sv%s" % (hh,vv)
    print ("Image tile %s is downloading..." % tilename)
    self.ftp.retrlines('NLST',fileList.append)
    for filename in fileList:
        if tilename in filename:
            self.ftp.retrbinary('RETR %s' % filename, open(filename,'wb').write)
            print ("File downloaded")
            break
    else:
        print (filename, "not found")
    self.ftp.close()

break上記のfor を置き換えるだけcontinueで動作するはずです。-さらに良いことに、for ループには他のステートメントがないため、その行を完全に削除してください。

于 2013-10-08T14:41:20.033 に答える