使用python脚本从FTP位置下载目录/文件

时间:2016-07-05 08:47:14

标签: python ftplib

下载不在python中工作?

我编写了一个简单的python程序,从FTP位置获取文件但是当我执行它时,它会出错[Errno 13] Permission denied message。

我的代码如下。知道为什么它不起作用吗?

import ftplib
from ftplib import FTP, error_perm

def getFTPDir(dirpath):

    f = ftplib.FTP(ip, username, password)

    try:
        f.cwd(dirpath)
        nameList = f.nlst()
        oldest = nameList[0]
        newest = nameList[-1]

        newest = oldest

        newDirPath = dirpath +'/'+ newest

        print f.cwd(newDirPath)
        subNameList = f.nlst()

        for i in range (len(subNameList)):
            f.cwd( newDirPath + '/' + str(subNameList[i]) )
            nameList1 = f.nlst()

            filename = nameList1[i]
            print "downloading..............", filename


            f.retrbinary('RETR '+ filename, open(os.path.join(destination,localPath),"wb").write)
            print filename + " downloaded"

            try:
                fhandle = open(filename, 'wb')
                f.retrbinary('RETR ' + filename, fhandle.write)

            except Exception, e:
                print str(e)

            finally:
                fhandle.close()

    except error_perm:
        return

    except Exception, e:
        print str(e)

    finally: 
        f.close()

1 个答案:

答案 0 :(得分:0)

ftplib的文档说(强调我的):

  

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

     

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

所以这里有两个可能的错误原因:

  • destinationlocalPath可能指向不存在的文件夹或不可写的文件夹或文件(顺便说一下,你会在每次迭代时重写相同的文件......)
  • 如果文件未在一个块中传输,则尝试打开每个块的目标文件而不关闭任何内容

不要这样做,但继续做下一行写的内容,或者更好地使用with:

   try:
        localname = os.path.join(destination,localPath)
        # a spy to control the names, comment it out when it works
        print filename, " -> ", localname 
        with open(localname, 'wb') as fhandle
            f.retrbinary('RETR ' + filename, fhandle.write)

   except Exception as e:
        print str(e)

这样,你可以看到你试图写的地方......