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?