В конце концов мне не пришлось реализовывать его из-за изменения требований, но после просмотра и анализа вашего решения это имело смысл. Я постараюсь успеть реализовать это и дам вам знать

ужно иметь возможность загружать файл через FTP и SFTP в Python, но с некоторыми не очень обычными ограничениями.

Файл НЕ ДОЛЖЕН быть записан на диск.

Файл, как он генерируется, - это вызов API и запись ответа в файл в формате JSON.

Есть несколько вызовов API. Невозможно получить весь результат за один вызов API.

Я не могу сохранить в строковой переменной полный результат, выполнив несколько необходимых вызовов и добавляя их в каждый вызов, пока у меня не останется весь файл в памяти. Файл может быть огромным, и есть ограничение на ресурсы памяти. Каждый кусок должен быть отправлен и память освобождена.

Итак, вот пример кода того, что я хотел бы:

def chunks_generator():
    range_list = range(0, 4000, 100)
    for i in range_list:
        data_chunk = requests.get(url=someurl, url_parameters={'offset':i, 'limit':100})
        yield str(data_chunk)

def upload_file():
    chunks_generator = chunks_generator()
    for chunk in chunks_generator:
        data_chunk= chunk
        chunk_io = io.BytesIO(data_chunk)
        ftp = FTP(self.host)
        ftp.login(user=self.username, passwd=self.password)
        ftp.cwd(self.remote_path)
        ftp.storbinary("STOR " + "myfilename.json", chunk_io)

Я хочу только один файл со всеми кусками. У меня уже есть и работает, если у меня есть весь файл в памяти и отправить его сразу, как это:

string_io = io.BytesIO(all_chunks_together_in_one_string)
ftp = FTP(self.host)
ftp.login(user=self.username, passwd=self.password)
ftp.cwd(self.remote_path)
ftp.storbinary("STOR " + "myfilename.json", string_io )

бонус

Мне нужно это в ftplib, но оно будет нужно и в Paramiko для SFTP. Если есть другие библиотеки, которые будут работать лучше, я открыт.

Как насчет того, если мне нужно заархивировать файл? Могу ли я заархивировать каждый чанк и одновременно отправить чанк с чипом?

Ответы на вопрос(0)

Ваш ответ на вопрос