Python ftp下载和归档

Python ftp下载和归档,python,ftp,Python,Ftp,我一直在尝试用python编写代码,对ftp的主目录进行分级,并将其归档到本地pc中。我不是一个业余程序员,python对我来说是相当新的。 我现在得到的错误是 File "C:\Users\Ali\Desktop\ftp_archiving_script.py", line 24, in <module> ftpDownload = ftp.retrbinary('RETR', filename) 有人能在这个问题上给我指点一下吗 谢谢, 更新 try: for file

我一直在尝试用python编写代码,对ftp的主目录进行分级,并将其归档到本地pc中。我不是一个业余程序员,python对我来说是相当新的。 我现在得到的错误是

File "C:\Users\Ali\Desktop\ftp_archiving_script.py", line 24, in <module>
ftpDownload = ftp.retrbinary('RETR', filename)
有人能在这个问题上给我指点一下吗

谢谢,

更新

try:
    for filename in filenames:
        with io.StringIO() as fObject:
            ftp.retrbinary('RETR %s' %filename, fObject.write)
            with ZipFile(os.path.join('C:\\','DC_archive.zip'), 'w') as myzip:
                myzip.write(fObject, compress_type=compression)
                myzip.close()
更新了@fals的回溯。。。此外,这是使用下面的代码,而不是我在顶部的代码

    Traceback (most recent call last):
  File "C:\Users\Ali\Desktop\ftp_archive2.py", line 20, in <module>
    ftpDownload = ftp.retrbinary('RETR ' + filename, f.write)
  File "C:\Python33\lib\ftplib.py", line 424, in retrbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 352, in ntransfercmd
    resp = self.sendcmd(cmd)
  File "C:\Python33\lib\ftplib.py", line 259, in sendcmd
    return self.getresp()
  File "C:\Python33\lib\ftplib.py", line 233, in getresp
    raise error_perm(resp)
ftplib.error_perm: 550 File not found
回溯(最近一次呼叫最后一次):
文件“C:\Users\Ali\Desktop\ftp\u archive2.py”,第20行,在
ftpDownload=ftp.retrbinary('RETR'+文件名,f.write)
文件“C:\Python33\lib\ftplib.py”,第424行,在retrbinary中
使用self.transfercmd(cmd,rest)作为连接:
文件“C:\Python33\lib\ftplib.py”,第386行,在transfercmd中
返回self.ntransfercmd(cmd,rest)[0]
文件“C:\Python33\lib\ftplib.py”,第352行,在ntransfercmd中
resp=self.sendcmd(cmd)
文件“C:\Python33\lib\ftplib.py”,第259行,在sendcmd中
返回self.getresp()
文件“C:\Python33\lib\ftplib.py”,第233行,在getresp中
升起错误\u perm(resp)
ftplib.error\u perm:找不到550文件

来自Python文档,用于:

FTP.retrbinary(命令,回调[,maxblocksize[,rest]])

以二进制传输模式检索文件。命令应该是一个 适当的RETR命令:“RETR文件名”。回调函数是 使用单个字符串参数为接收到的每个数据块调用 给出数据块

它不表示它返回类似于对象或字符串的文件

相反,您必须创建自己的回调来写入文件对象

with open('my-downloaded-file', 'wb') as f:
    ftp.retrbinary('RETR %s' % filename, f.write)
这里,
f.write
是回调函数,它将在数据从套接字到达时接收数据。如果不想使用
open
将文件保存到磁盘,可以使用该模块模拟内存中的文件。

尝试以下代码:

import ftplib
from io import BytesIO
import os
import zipfile

REMOTE_HOST = 'xxx.xxx.xxx'
REMOTE_USER = '...'
REMOTE_PASS = '...'
REMOTE_DIR_PATH = '//'
LOCAL_ZIP_PATH = os.path.join(os.path.expanduser('~'), 'Desktop', 'DC_archive.zip')

ftp = ftplib.FTP(REMOTE_HOST)
try:
    ftp.login(REMOTE_USER, REMOTE_PASS)
    ftp.cwd(REMOTE_DIR_PATH)
    filenames = ftp.nlst()
    with zipfile.ZipFile(LOCAL_ZIP_PATH, 'w') as zf:
        for filename in filenames:
            with BytesIO() as f:
                try:
                    ftpDownload = ftp.retrbinary('RETR ' + filename, f.write)
                    zf.writestr(filename, f.getvalue())
                except ftplib.Error as e:
                    print('Skip {}: {}'.format(filename, e))
finally:
    ftp.quit()

谢谢你,我将尝试修复它,看看我得到了什么相同的错误。我现在就更新代码。文件“C:\Users\Ali\Desktop\ftp\u archiving\u script.py”,第23行,ftp.retrbinary('RETR%s'%filename,fObject.write')文件“C:\Users\Ali\Desktop\ftp\u archive2.py”,第17行,带zipfile.zipfile.zipfile(LOCAL_ZIP_PATH,'w')作为zf:这是我从您的代码中得到的错误。@madmanali93,显示完整回溯或回溯的最后一行。@madmanali93,我想你是为AustinPhillips发回了追踪,不是为我;)。没有
。。。zipfile.zipfile…
在您发布的回溯中。很抱歉现在让人们感到困惑XD我将发布另一个now@madmanali93,我明白了。将本地路径更改为您具有写入权限的路径。例如,
LOCAL\u ZIP\u PATH=r'C:\Users\username\DC\u archive.ZIP'
import ftplib
from io import BytesIO
import os
import zipfile

REMOTE_HOST = 'xxx.xxx.xxx'
REMOTE_USER = '...'
REMOTE_PASS = '...'
REMOTE_DIR_PATH = '//'
LOCAL_ZIP_PATH = os.path.join(os.path.expanduser('~'), 'Desktop', 'DC_archive.zip')

ftp = ftplib.FTP(REMOTE_HOST)
try:
    ftp.login(REMOTE_USER, REMOTE_PASS)
    ftp.cwd(REMOTE_DIR_PATH)
    filenames = ftp.nlst()
    with zipfile.ZipFile(LOCAL_ZIP_PATH, 'w') as zf:
        for filename in filenames:
            with BytesIO() as f:
                try:
                    ftpDownload = ftp.retrbinary('RETR ' + filename, f.write)
                    zf.writestr(filename, f.getvalue())
                except ftplib.Error as e:
                    print('Skip {}: {}'.format(filename, e))
finally:
    ftp.quit()