FTP нет тайм-аута передачи при передаче — Python ftplib

#python #ftp #timeout #ftp-client #ftplib

#python #ftp #тайм-аут #ftp-клиент #ftplib

Вопрос:

Не очень хорошо разбираюсь в FTP-серверах… Передача большого объема данных (в текстовом формате) с FTP-сервера NOAA (Национальное управление океанических и атмосферных исследований) и вставка их на SQL-сервер. Все прошло хорошо для нескольких десятков миллионов строк, пока я не добрался до самого большого файла, с которым я когда-либо сталкивался, размером ~ 2,5 МБ [только текст].

     for file in ftpList:
        if file.endswith(".gz") and not failedRun:
            flo = io.BytesIO()
            ftp.retrbinary('RETR '   file, flo.write)
            flo.seek(0)
            with gzip.open(flo, 'rb') as f:
                for line in f:
                    ## REPLACE FUNCTION FOR QUERY FILE ##
                    cursor.execute(qry_wx)
                    cursor.commit()
 

При попытке запустить этот файл большего размера, чем обычно, я получаю эту ошибку:

 2021-01-02 12:07:19,558-ERROR-Error: 421 No transfer timeout (300 seconds): closing control connection
Traceback (most recent call last):
  File "E:PythonProjectsISHWX_TO_DB.py", line 72, in <module>
    ftp.retrbinary('RETR '   file, flo.write)
  File "E:ProgramDataAnaconda3libftplib.py", line 441, in retrbinary
    self.voidcmd('TYPE I')
  File "E:ProgramDataAnaconda3libftplib.py", line 278, in voidcmd
    return self.voidresp()
  File "E:ProgramDataAnaconda3libftplib.py", line 251, in voidresp
    resp = self.getresp()
  File "E:ProgramDataAnaconda3libftplib.py", line 244, in getresp
    raise error_temp(resp)
ftplib.error_temp: 421 No transfer timeout (300 seconds): closing control connection
 

Я попытался изменить параметр timeout при первоначальном вызове класса FTP на> 300 секунд, но с тех пор узнал, что это время ожидания без передачи является значением по умолчанию для FTP-сервера, и я не могу его изменить.

Я хотел бы лучше объяснить проблему, но, как я уже сказал, я довольно новичок в этом и не до конца понимаю метод retrbinary. Есть какие-нибудь предложения здесь?

Ответ №1:

Сервер имеет ограничение на то, как долго вы не можете передавать какие-либо файлы, прежде чем сервер разорвет соединение.

В качестве обходного пути сначала загрузите все файлы. И только затем обрабатывайте их.