从python中的ftp服务器的文件列表中下载最后创建的o修改过的文件

时间:2014-02-26 16:55:40

标签: python datetime ftp

我有下一个代码,它下载了zip文件,但我只需要ftp中最后修改或创建的文件,而不是所有文件。
例如,我有:

  • one_20140220.xml.zip
  • one_20140221.xml.zip
  • one_20140222.xml.zip

在这种情况下,我只需要下载“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()

2 个答案:

答案 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

您可以将此函数传递给所有文件名的完整列表,它会返回最新文件名的文件名。