2017-05-12 57 views
0

使用案例:處理的EOFError同時從服務器下載文件

下載中心百上千個XML文件(從字節大小爲50 MB /文件)的結構是這樣/年,月/年 - 月 - 日/小時/文件與ftplib。 因此,我通過每個小時文件夾循環一個給定的一天,併爲每一個我存儲所有的文件名與ftp.nlst(),然後我循環通過每個文件名,我donwload像這樣的有關文件。

with open(local_file, 'wb') as fhandle: 
    try: 
     ftp.retrbinary('RETR ' + filename, fhandle.write) 
    except EOFError: 
     try: 
      fhandle.close() 
      os.remove(local_file) 
      ftp = ftplib.FTP() 
      ftp.connect(self.remote_host,self.port, timeout=60) 
      ftp.login(self.username, self.passwd, acct="") 
      ftp.cwd(self.input_folder + '/' + subdir) 
      try: 
       with open(local_file, 'wb') as fhandle: 
       ftp.retrbinary('RETR ' + filename, fhandle.write, 8192) 
      except: 
       self.log.error('i give up !!!') 

預計:

對於給定的輸入文件夾中的每一天,下載所有有關XML文件

我得到什麼:

的EOFError

什麼我已經嘗試過了:

  • 我已經去了所有可能的帖子關於 stackoverflow和一般的網絡。
  • 我試圖關閉並打開 小時文件夾中每個子文件夾的連接。
  • 它似乎並不是一個導致問題的特定文件。這絕對不是第一個。我在使用ftp.retrbinary()下載文件時獲取此EOFError。這與我下載成千上萬個xml文件的事實有關,因爲我已經用2000個文件測試了這個腳本,並且我沒有任何例外,但總是有大約287000個文件。而我不明白的是,該腳本每次下載的XML文件相同的量/數量,周圍159 000,它始終是
  • 我曾嘗試在

    ftp.retrbinary('RETR ' + filename, fhandle.write,4096)

  • 與緩衝區大小玩

問:

這可能是因爲我錯過了什麼? 如何處理此EOFError以繼續下載我的所有文件......並且不會失去理智。

+0

你什麼時候得到'EOFError'?在第一個文件已經?或在後續的文件?在什麼聲明?向我們展示異常堆棧跟蹤。 - 從你的問題來看,並不清楚你的問題與*「下載成千上萬個xml文件」*有什麼關係。 –

+0

@MartinPrikryl它似乎不是一個導致問題的具體文件。這絕對不是第一個。用'ftp.retrbinary()'下載文件時,我得到這個'EOFError'。對不起,我完全忘記了堆棧跟蹤,我會在週一發佈一個。這與我下載成千上萬個xml文件的事實有關,因爲我已經用2000個文件測試了這個腳本,並且我沒有任何例外,但總是有大約287000個文件。而我不undertsnad的是,腳本donningds每次相同的amoun/xml文件的數量,約159 000,它始終是 – sdikby

+0

所有這些信息應該在你的問題從第一時間。請編輯它。 –

回答

0

最後我找到了解決我的問題的方法。而不是打開每個子文件夾的連接,現在我打開每個要下載的文件的連接。這是性能較差,但我通過這EOFError。 我還發現,我想從下載文件的FTP服務器有限制例如並行連接的數量或連接可能會持續多長時間。