Форум сайта python.su
Доброго времени суток!
Помогите решить следующую задачу.
Нужно в каталоге найти файлы по масками (как найти по одной маске с помощью glob и fnmach знаю), причём в каталоге имеются файлы с одинаковыми частями имён (маска задается по этой части имени) и нужно найти файл с более поздней датой модификации.
Офлайн
Офлайн
Вот как реализовал поиск по маскам:
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)
Отредактировано PunK_HS (Май 7, 2014 18:18:56)
Офлайн
Вроде короче сделать итератор, хотя все равно коряво :( может кто лучше придумает.
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
Офлайн
doza_andлучше импортировать fnmatch, так как glob не используетсяfor f in glob.fnmatch.filter(fl, pattr):
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' >>>
Офлайн
Коллеги, как изменить функцию для выполнения той же задачи на 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)
Офлайн
Изменил вот так:
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)
Офлайн
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
Офлайн