Python - Cargue un archivo en memoria (generado por llamadas API) en FTP por trozos

Necesito poder cargar un archivo a través de FTP y SFTP en Python pero con algunas restricciones no tan habituales.

El archivo NO DEBE escribirse en el disco.

El archivo de cómo se genera es llamando a una API y escribiendo la respuesta que está en JSON en el archivo.

Hay varias llamadas a la API. No es posible recuperar el resultado completo en una sola llamada de la API.

No puedo almacenar en una variable de cadena el resultado completo haciendo las múltiples llamadas necesarias y agregando en cada llamada hasta que tenga todo el archivo en la memoria. El archivo podría ser enorme y existe una restricción de recursos de memoria. Se debe enviar cada fragmento y desasignar la memoria.

Así que aquí hay un código de muestra de lo que me gustaría:

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)

Solo quiero un archivo con todos los fragmentos agregados. Lo que ya tengo y funciona es si tengo todo el archivo en la memoria y lo envío de una vez de esta manera:

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 )

Prim

Necesito esto en ftplib pero también lo necesitaré en Paramiko para SFTP. Si hay otras bibliotecas que funcionarían mejor, estoy abierto.

¿Qué tal si necesito comprimir el archivo? ¿Puedo comprimir cada fragmento y enviar el fragmento fragmentado a la vez?

Respuestas a la pregunta(1)

Su respuesta a la pregunta