需要通过 ftputil 模块连接到 ftp,打开一个包含记录的现有文件并将新记录添加到这些记录的末尾

Need to connect to ftp through the ftputil module, open an existing file with records and add new records to the end of those records

我为此使用了 ftputil 模块,但是 运行 遇到了一个问题,它不支持 'a'(append) 附加到文件,如果你通过 '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)

目标是保留文件中的旧条目,并在每次再次调用脚本时将新条目添加到文件末尾。

的确,ftputil 不支持追加。因此,要么您必须下载完整的文件,然后重新上传带有附加记录的文件。或者您将不得不使用另一个 FTP 库。

例如内置的Python ftplib 支持追加。另一方面,它不(至少不容易)支持流媒体。相反,在内存中构建新记录并立即 upload/append 它们更容易:

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)

ftputil 作者在这里:-)

Martin 是正确的,因为没有明确的追加模式。也就是说,您可以使用 rest argument 打开类似文件的对象。在您的情况下,rest 需要是您要附加到的文件的原始长度。

文档警告不要使用指向文件后的 rest 参数,因为我很确定 rest 不会以这种方式使用。但是,如果您仅针对特定服务器使用您的程序并且可以验证其行为,则可能值得尝试 rest。我很想知道它是否适合你。