В конце концов мне не пришлось реализовывать его из-за изменения требований, но после просмотра и анализа вашего решения это имело смысл. Я постараюсь успеть реализовать это и дам вам знать
ужно иметь возможность загружать файл через 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. Если есть другие библиотеки, которые будут работать лучше, я открыт.
Как насчет того, если мне нужно заархивировать файл? Могу ли я заархивировать каждый чанк и одновременно отправить чанк с чипом?