Как получить самый последний файл - PullRequest
4 голосов
/ 20 марта 2012

Я новичок в языке Python, и мне нужно написать код, в котором указан каталог, содержащий файлы со случайными именами, например:

JuniperAccessLog-standalone-FCL_VPN-20120319-1110.gz
JuniperAccessLog-standalone-FCL_VPN-20120321-1110.gz

Мне нужно получить более новый файл

Я пробую это, но безуспешно.

import os
from datetime import datetime 

t = datetime.now()
archive = t.strftime("JuniperAccessLog-standalone-FCL_VPN-%Y%m%d-%H*.gz")
file = os.popen(archive)

Результат:

sh: JuniperAccessLog-standalone-FCL_VPN-20120320-10*.gz: command not found

есть ли возможность использовать эту логику?

Ответы [ 4 ]

8 голосов
/ 20 марта 2012

Если вам нужен самый последний файл, вы можете воспользоваться тем, что они сортируются в порядке даты и времени:

import os

logdir='.' # path to your log directory

logfiles = sorted([ f for f in os.listdir(logdir) if f.startswith('JuniperAccessLog-standalone-FCL_VPN')])

print "Most recent file = %s" % (logfiles[-1],)
2 голосов
/ 20 марта 2012

Вы можете получить то, что хотите, используя модуль glob:

def GetLatestArchive():
    "Return the most recent JuniperAccessLog file for today's date."

    import glob
    from datetime import datetime 

    archive_format = datetime.now().strftime("JuniperAccessLog-standalone-FCL_VPN-%Y%m%d-%H*.gz")
    archives = glob.glob(archive_format)

    if len(archives) > 0:
        # The files should come sorted, return the last one in the list.
        return archives[-1]
    else:
        # No files were matched
        return None
0 голосов
/ 20 марта 2012
  1. Определите функцию для анализа даты в имени файла:

    def date_from_path(path):
        m = re.match(r"JuniperAccessLog-standalone-FCL_VPN-(\d+)-(\d+).\gz",
                     path)
        return int(m.group(1)), int(m.group(2))
    

    Эта функция использует тот факт, что ваши значения даты и времени представляются в виде целых чисел.

  2. Используйте max, чтобы получить самый последний файл:

    max(os.listdir(directory), key=date_from_path)
    
0 голосов
/ 20 марта 2012

glob будет делать то, что вы пытаетесь сделать с вашим вызовом.

import os
import glob
from datetime import datetime 

t = datetime.now()
archive = t.strftime("JuniperAccessLog-standalone-FCL_VPN-%Y%m%d-%H*.gz")
files = glob.glob(archive)
for f in files:
   # do something with f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...