Необходимо подключиться к ftp через модуль ftputil, открыть существующий файл с записями и добавить новые записи в конец этих записей

#python #python-3.x #ftp #ftputil

Вопрос:

Я использовал для этого модуль ftputil, но столкнулся с проблемой, что он не поддерживает добавление » a «(добавление) в файл, и если вы пишете через «w», он перезаписывает содержимое.

Это то, что я пытался, и я застрял там:

 with ftputil.FTPHost(host, ftp_user, ftp_pass) as ftp_host:
      with ftp_host.open("my_path_to_file_on_the_server", "a") as fobj:
         cupone_wr = input('Enter coupons with a space: ')
         cupone_wr = cupone_wr.split(' ')
         for x in range(0, len(cupone_wr)):
             cupone_str = '<p>Your coupon %s</p>n' % cupone_wr[x]
             data = fobj.write(cupone_str)
         print(data)
 

Цель состоит в том, чтобы оставить старые записи в файле и добавлять новые записи в конец файла каждый раз, когда скрипт вызывается снова.

Ответ №1:

Действительно, ftputil не поддерживает добавление. Поэтому либо вам придется загрузить полный файл и повторно загрузить его с добавленными записями. Или вам придется использовать другую библиотеку FTP.

Например, встроенный Python ftplib поддерживает добавление. С другой стороны, он не поддерживает (по крайней мере, нелегко) потоковую передачу. Вместо этого проще создавать новые записи в памяти и загружать/добавлять их сразу:

 from ftplib import FTP
from io import BytesIO

flo = BytesIO() 

cupone_wr = input('Enter coupons with a space: ')
cupone_wr = cupone_wr.split(' ')
for x in range(0, len(cupone_wr)):
    cupone_str = '<p>Your coupon %s</p>n' % cupone_wr[x]
    flo.write(cupone_str)

ftp = FTP('ftp.example.com', 'username', 'password')

flo.seek(0)
ftp.storbinary('APPE my_path_to_file_on_the_server', flo)
 

Ответ №2:

ftputil автора здесь 🙂

Мартин прав в том, что здесь нет явного режима добавления. Тем не менее, вы можете открывать файлоподобные объекты с помощью rest аргумента. В вашем случае rest должна быть исходная длина файла, к которому вы хотите добавить.

Документация предостерегает от использования rest аргумента, который указывает после файла, потому что я совершенно уверен rest , что он не будет использоваться таким образом. Однако, если вы используете свою программу только против определенного сервера и можете проверить ее поведение, возможно, стоит поэкспериментировать rest . Мне было бы интересно, сработает ли это для вас.

Комментарии:

1. Спасибо всем и вам тоже за ответы. Проблема была решена таким образом: открыл файл, сохранил старые записи в режиме «r» в переменную. Затем я написал новые в режиме » w » и в конце объединил обе записи.

2. @OlegPaslavskiy Спасибо за отзыв. Не могли бы вы более подробно описать, какой из этих шагов произошел на сервере по сравнению с на стороне клиента и как вы объединили файлы? Вы имеете в виду, что создали полный файл на стороне клиента и загрузили его на сервер?