#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 Спасибо за отзыв. Не могли бы вы более подробно описать, какой из этих шагов произошел на сервере по сравнению с на стороне клиента и как вы объединили файлы? Вы имеете в виду, что создали полный файл на стороне клиента и загрузили его на сервер?