2013-10-08 5 views
0

Я написал класс, который загружает один файл с ftp-сайта (ftp://ladsweb.nascom.nasa.gov/allData/5/MOD11A1/) с указанием частей имени файла при вызове экземпляра класса. Позже я написал цикл 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) 

ответ

-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 для continue выше, и он должен работать. - Еще лучше, поскольку tehre не является никакими другими утверждениями в вашем цикле for, просто удалите эту строку целиком.

+0

Я пробовал с «продолжением», но это не работает. «break» находится внутри класса. Я использовал его для разрыва операции, если найден файл с требуемым именем. Но тогда другой экземпляр класса инициируется с самого начала циклом в нижней части кода, который я опубликовал. Итак, этот «разрыв» находится внутри класса. Цикл, о котором мы говорим, находится вне класса и итерации над экземплярами класса. – multigoodverse

Смежные вопросы