Python - Carrega um arquivo na memória (gerado por chamadas de API) no FTP por pedaços

Eu preciso fazer o upload de um arquivo por FTP e SFTP em Python, mas com algumas restrições não tão comuns.

O arquivo NÃO DEVE ser escrito no disco.

O arquivo como ele é gerado chamando uma API e gravando a resposta que está em JSON no arquivo.

Existem várias chamadas para a API. Não é possível recuperar o resultado inteiro em uma única chamada da API.

Não consigo armazenar em uma variável de seqüência de caracteres o resultado completo executando as várias chamadas necessárias e anexando cada chamada até que eu tenha o arquivo inteiro na memória. O arquivo pode ser enorme e há uma restrição de recurso de memória. Cada pedaço deve ser enviado e a memória desalocada.

Então, aqui está um exemplo de código do que eu gostaria de:

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)

Quero apenas um arquivo com todos os pedaços anexados. O que eu já tenho e funciona é se eu tiver o arquivo inteiro na memória e enviá-lo ao mesmo tempo assim:

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 )

Bônus

Eu preciso disso no ftplib, mas também no Paramiko para SFTP. Se houver outras bibliotecas que funcionem melhor, estou aberto.

E se eu precisar compactar o arquivo? Posso zipar cada bloco e enviar o bloco com zip de cada vez?

questionAnswers(1)

yourAnswerToTheQuestion