【发布时间】: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