Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2014 14:50:57

PunK_HS
От:
Зарегистрирован: 2011-07-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

Доброго времени суток!
Помогите решить следующую задачу.
Нужно в каталоге найти файлы по масками (как найти по одной маске с помощью glob и fnmach знаю), причём в каталоге имеются файлы с одинаковыми частями имён (маска задается по этой части имени) и нужно найти файл с более поздней датой модификации.



Офлайн

#2 Май 2, 2014 15:53:21

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

PunK_HS
найти файл с более поздней датой модификации.

os.stat



Офлайн

#3 Май 7, 2014 18:17:47

PunK_HS
От:
Зарегистрирован: 2011-07-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

Вот как реализовал поиск по маскам:

import os, fnmatch, re
dir_source = os.curdir
masks = ["*.txt", "*.log"]
def find_file_for_masks(root, masks):
    root = os.path.abspath(root)
    parrent = re.compile("|".join(map(fnmatch.translate, masks)), re.I).match
    for path, dirs, files in os.walk(root):
        for name in filter(parrent, files):
            filename = os.path.join(path, name)
            print(filename)
find_file_for_masks(dir_source, masks)
Как реализовать выбор файла с более поздней датой модификации? Например из всех файлов .txt выбрать тот, который изменялся последним.



Отредактировано PunK_HS (Май 7, 2014 18:18:56)

Офлайн

#4 Май 7, 2014 19:59:13

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

Вроде короче сделать итератор, хотя все равно коряво :( может кто лучше придумает.

def PathFind(pattr, root="."):
    u"""аналог find из bash"""
    for di, dl, fl in os.walk(root):
        for f in glob.fnmatch.filter(fl, pattr):
            yield os.path.join(di, f)
t_old=0
found = None
for name in PathFind("*.txt"):
    t = os.stat(name).st_mtime
    if t > t_old:
        found=name
        t_old=t



Офлайн

#5 Май 7, 2014 21:38:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9730
Репутация: +  843  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

doza_and
for f in glob.fnmatch.filter(fl, pattr):
лучше импортировать fnmatch, так как glob не используется

PunK_HS
Например из всех файлов .txt выбрать тот, который изменялся последним.

>>> import os
>>> import glob
>>> 
>>> d = {f: os.stat(f).st_mtime for f in glob.iglob('*.txt')}
>>> max(d, key=lambda i: d[i])
'vi_help.txt'
>>>

>>> d = {'a': 123, 'b': 456}
>>> max(d, key=lambda i: d[i])
'b'
>>>



Офлайн

#6 Май 10, 2014 12:25:09

PunK_HS
От:
Зарегистрирован: 2011-07-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

Коллеги, как изменить функцию для выполнения той же задачи на FTP?
Вот что пока есть…

def listFiles(files, masks):
    findFiles = []
    parrent = re.compile("|".join(map(fnmatch.translate, masks)), re.I).match
    for filename in filter(parrenr, files):
        d = {filename: int((ftp.sendcmd(`MDTM ` + files))[4:])}
        findFiles.append(max(d, key=lambda i: d[i]))
    return findFiles



Отредактировано PunK_HS (Май 13, 2014 15:53:59)

Офлайн

#7 Май 13, 2014 15:54:11

PunK_HS
От:
Зарегистрирован: 2011-07-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

Изменил вот так:

masks = ["*.txt", "*.log"]
def listFiles(files, masks):
    findFiles = []
    parrent = re.compile("|".join(map(fnmatch.translate, masks)), re.I).match
    d = {filename: ((ftp.sendcmd('MDTM ' + filename))[4:]) for filename in filter(parrent, files)}
    findFiles.append(max(d, key=lambda i: d[i]))
    return findFiles
Но выводиться последний измененный файл по всем маскам, как сделать так, чтобы выбирал по каждой из масок в отдельности?



Отредактировано PunK_HS (Май 13, 2014 15:55:36)

Офлайн

#8 Май 13, 2014 21:38:55

PunK_HS
От:
Зарегистрирован: 2011-07-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск файла по маскам и дате изменения

def listFiles(files, masks):
    findFiles = []
    for x in masks:
        parrent = re.compile(fnmatch.translate(x)).match
        d = {filename: ((ftp.sendcmd('MDTM ' + filename))[4:]) for filename in filter(parrent, files)}
        print d
        findFiles.append(max(d, key=lambda i: d[i]))
    return findFiles
Такой вариант работает! Поругайте, если что не так



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version