【问题标题】:Python Ftp Not a Direcoty errorPython Ftp 不是目录错误
【发布时间】:2015-01-10 06:58:03
【问题描述】:

我正在尝试从 ftp 服务器下载文件并将数据导入 django。所以我创建了一个列表,其中包含服务器地址、登录详细信息、路径、文件名以及要下载文件的路径并传递给执行下载的函数。当它移动到客户端服务器时,它是我系统中的工作文件,它显示如下错误

“下载 C_VAR1_31012014_1.DAT 时出错 - [Errno 20] 不是目录:'common/VARRate/C_VAR1_31012014_1.DAT”

这就是列表的样子

self.fileDetails = { 'NSE FO VAR RATE FILE': ('ftp.xxx.com', username, passwd, 'common/VARRate', 'C_VAR1_\d{4}201[45]_\d{1}.DAT', 'Data/samba/Ftp/Capex10/NSECM/VAR RATE'), }

  for fileType in self.fileDetails:
        self.ftpDownloadFiles(fileType)

这个细节将传递给函数下面的函数

def ftpDownloadFiles(self, fileType):
    logging.info('Started ' + str(fileType))
    try:
        ftpclient = ftplib.FTP(self.fileDetails[fileType][FDTL_SRV_POS],
                                self.fileDetails[fileType][FDTL_USR_POS],
                                self.fileDetails[fileType][FDTL_PSWD_POS],
                                timeout=120)
        #ftpclient.set_debuglevel(2)
        ftpclient.set_pasv(True)
        logging.info('Logged in to ' + self.fileDetails[fileType][FDTL_SRV_POS] +\
                          time.asctime())
        logging.info('\tfor type: '+ fileType)
    except BaseException as e:
        print e
        return

    remotepath = self.fileDetails[fileType][FDTL_PATH_POS]

    #matched, unmatched, downloaded = 0
    try:
        ftpclient.cwd(remotepath)
        ftpclient.dir(filetimestamps.append)
    except BaseException as e:
        logging.info('\tchange dir error : ' + remotepath + ' ' +\
                         e.__str__())
    self.walkTree(ftpclient, remotepath, fileType)
    #logging.info('\n\tMatched %d, Unmatched %d, Downloaded %d' 
    # % (matched, unmatched, downloaded))
    ftpclient.close()

从这里它将调用下一个函数,下载过程将开始

def walkTree(self, ftpclient, remotepath, fileType):
    # process files inside remotepath; cwd already done
    # remotepath to be created if it doesnt exist locally
    copied=matched=downloaded=imported = 0
    files = ftpclient.nlst()

    localpath = self.fileDetails[fileType][FDTL_DSTPATH_POS]
    rexpCompiled = re.compile(self.fileDetails[fileType][FDTL_PATRN_POS])

    for eachFile in files:
        try:
            ftpclient.cwd(remotepath+'/'+eachFile)
            self.walkTree(ftpclient, remotepath+'/'+eachFile+'/', fileType)
        except ftplib.error_perm: # not a folder, process the file
            # every file to be saved in same local folder as on ftp srv
            saveFolder = remotepath
            saveTo = remotepath + '/' + eachFile
            if not os.path.exists(saveFolder):
                try:
                    os.makedirs(saveFolder)
                    print "directory created"
                except BaseException as e:
                    logging.info('\tcreating %s : %s' % (saveFolder, e.__str__()))
            if (not os.path.exists(saveTo)):
                try:
                    ftpclient.retrbinary('RETR ' + eachFile, open(saveTo, 'wb').write)
                    #logging.info('\tdownloaded '  + saveTo)
                    downloaded += 1
                except BaseException as e:
                    logging.info('\terror downloading %s - %s' % (eachFile, e.__str__()))
                except ftplib.error_perm:
                    logging.info('\terror downloading %s - %s' % (eachFile, ftplib.error_perm))  
            elif (fileType == 'NSE CASH CLOSING FILE'):  # spl case if file exists
                try:
                    # rename file
                    yr = int(time.strftime('%Y')) - 1
                    os.rename(saveTo, saveTo + str(yr))
                    # download it
                    ftpclient.retrbinary('RETR ' + eachFile, open(saveTo, 'wb').write)
                    downloaded += 1
                except BaseException as e:
                    logging.info('\terror rename/ download %s - %s' % (eachFile, e.__str__()))

谁能帮我解决这个问题

【问题讨论】:

  • 您面临的实际问题是什么?
  • 在我的系统中运行此代码时,文件正在正确下载,但是当将此代码移动到我的客户端系统时,它显示错误“下载 C_VAR1_31012014_1.DAT 时出错 - [Errno 20] 不是目录: 'common/VARRate/C_VAR1_31012014_1.DAT" 。您可以看到我正在使用日志记录错误
  • 函数 def walkTree 发生错误,因为从那里保存日志
  • 你能告诉我这两种情况有什么区别吗:操作系统和 django 版本以及 python 版本。其中之一应该导致错误。我总是使用 django 调试工具栏来查看版本(也是我使用的重要第三方包的版本),因此您可以立即看到。
  • 如果错误出现在日志记录中,请向我们显示日志记录设置(在 settings.py 中)

标签: file python-2.7 ftp download


【解决方案1】:

尝试使用 os.path.join() 代替硬编码的斜杠作为操作系统下载到的路径分隔符。 / 或 \ 取决于本地操作系统。

例如在您的代码中:

saveTo = remotepath + '/' + eachFile

会变成:

saveTo = os.path.join(remotepath,eachFile)

https://docs.python.org/2/library/os.path.html

【讨论】:

  • 我做了你提到的,但它仍然显示相同的@michel.iamit
  • 查看问题的评论.. 如果它没有解决问题,你为什么接受这个作为答案?我想念信息:有什么区别:它在什么操作系统上工作,在哪个操作系统上不工作?会是权利吗?该进程是否有权访问该文件夹? (在本地开发系统上,您通常拥有所有权限,依此类推)
猜你喜欢
  • 2017-07-31
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2023-03-09
  • 2022-12-07
相关资源
最近更新 更多