Как открыть файл на FTP-сервере в режиме записи?Я знаю, что могу написать / создать файл напрямую (когда у меня есть данные), но я хочу сначала открыть его для записи, а только потом записать, как вы делаете это локально, используя contextmanager.
Причина в том, что я хочусоздать интерфейс, который бы имел унифицированные методы для работы с серверами протоколов передачи.В частности, SFTP и FTP.
Так что с SFTP все просто (используя paramiko
):
def open(sftp, fname, mode='r'):
return sftp.open(fname, mode=mode)
Теперь я могу сделать это:
with open(sftp, 'some_file.txt', 'w') as f:
f.write(data)
А потом ямогу прочитать то, что было написано
with open(sftp, 'some_file.txt', 'r') as f:
print(f.read().decode('utf-8'))
Как я могу сделать ту же реализацию для FTP (используя ftplib
)?
Чтение части для FTP, я смог реализовать, и я могу открытьфайл в режиме чтения так же, как с SFTP.Но как я могу открыть его в режиме записи?Метод ftplib storbinary
запрашивает данные, которые должны быть предоставлены «немедленно».Я имею в виду, что я уже должен передать данные, которые я хочу записать, с помощью метода open
(но тогда это будет противоречить цели единого метода)?
import io
def open(ftp, filename, mode='r'):
"""Open a file on FTP server."""
def handle_buffer(buffer_data):
bio.write(buffer_data)
# Reading implementation
if mode == 'r':
bio = io.BytesIO()
ftp.retrbinary(
'RETR %s' % filename, callback=handle_buffer)
bio.seek(0)
return bio
# Writing implementation.
if mode == 'w':
# how to open in write mode?
update
Пустьскажем, у нас есть непосредственная реализация записи в FTP:
bio = io.BytesIO
# Write some data
data = csv.writer(bio)
data.writerows(data_to_export)
bio.seek(0)
# Store. So it looks like storbinary does not open file in w mode, it does everything in one go?
ftp.storbinary("STOR " + file_name, sio)
Итак, вопрос в том, как я могу отделить запись данных от простого открытия файла в режиме записи.Это возможно даже с ftplib?