我有下一个代码,它下载了zip文件,但我只需要ftp中最后修改或创建的文件,而不是所有文件。
例如,我有:
在这种情况下,我只需要下载“one_20140222.xml.zip”文件 有谁可以帮助我吗?。我是使用python的新手。我该如何进行下一步?
#CODE
import ftplib
import os
import fnmatch
import datetime
from datetime import date, datetime, timedelta
ftp_server='ftp.blabla.com'
ftp_user='user'
ftp_pass='pass'
def download():
print 'dowloading from ftp server'
os.chdir('/root/dir/zip')
s = ftplib.FTP(ftp_server, ftp_user, ftp_pass)
s.cwd('one/two/')
fileList = s.nlst()
targetList = [fileName for fileName in fileList if fnmatch.fnmatch(fileName,'*.zip')]
if (targetList == []):
print 'No files to process'
for file in targetList:
print 'downloaded file: ' + file
try:
fileOut=open(file,'wb')
s.retrbinary('RETR '+file,fileOut.write)
fileOut.close()
except:
print 'Cant open file'
s.quit()
答案 0 :(得分:0)
鉴于
filename1 = 'one_20140220.xml.zip'
filename2 = 'one_20140221.xml.zip'
file1 = filename1.split('.')[0].split('_')
file2 = filename2.split('.')[0].split('_')
print file1[1] < file2[1]
print file1[1], file2[1]
>>> True
>>> 20140220 20140221
这应该让你进行比较检查。请注意,在这种情况下,您不必从字符串转换日期值,因为字符串比较(年月日)会给出正确的结果。
您可以设置字典,其中键为filex [0],值为所有filex [1]值的列表。然后循环遍历字典并选出最大值。
mydict ={filex[0]: [val1, val2, val3 ...], ... }
for f in mydict:
filename = f + max(mydict[f]) + '.xml.zip'
# Process the file name within a function
dofile(filename)
答案 1 :(得分:0)
假设您的所有文件都在您的示例中命名,这非常简单
import datetime
filenameFmt = "one_%Y%M%d.xml.zip" # You will need to update this to match the filenames
def getEarliestFile(arrayOfFiles):
namesWithDate = []
for filename in arrayOfFiles:
dt = datetime.datetime.strptime(filename,filenameFmt)
namesWithDate.append((filename,dt))
#sort the array in ascending order
namesWithDate = sorted(namesWithDate,key = lambda x: x[1])
#Grab and return the newest one
filename, dt = namesWithDate[-1]
return filename
您可以将此函数传递给所有文件名的完整列表,它会返回最新文件名的文件名。