Семён
Март 11, 2012 09:46:36
как сделать сделующее:
есть общий список файлов определённой директории-наименование списка files
как теперь его видоизменить,т.е. оставить в списке лишь только те файлы которые были изменены в приод времени между start b stop
import sys
import time as _time
from datetime import datetime
ticks = lambda x: int(_time.mktime(x.timetuple()))
start = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
stop = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
files=
#код формирования всех файлов ы директории
…
#как теперь этот список files изменить с вышеуказанными условиями?
…
#работаю потом уже со списком files,но только с теми файлами которые удовлетворили условиям
…
JOHN_16
Март 11, 2012 13:04:41
Смотрю я на ваши посты и только тяжело вздыхаю…
Вы судя по всему ищите встроенную функцию filter; открываем справку Питона, ищем описание функции, внимательно изучаем, пробуем, получаем нужный результат (подсказка: нужно написать лишь свою функцию которая бы отвечала за проверку вхождения в период)
Семён
Март 12, 2012 00:08:58
Т.е. получается так правильно я понял нужно сделать:
————
mport sys
import time as _time
from datetime import datetime
def fun1:
#st_mtime-время создания файла(последнего изменения-“пересоздания”)
vrizm=os.stat('/file1.txt').st_mtime
if (vrizm>=start) and (vrizm<=stop):
w=true
else:
w=false
return w
ticks = lambda x: int(_time.mktime(x.timetuple()))
start = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
stop = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
files=
#код формирования всех файлов ы директории
…
#как теперь этот список files изменить с вышеуказанными условиями в функции fun1
for i in files:
filter(fun1,files)
#работаю потом уже со списком files,но только с теми файлами которые удовлетворили условиям, т.е. список files уже другой-там только #остались файлы,которые последний раз изменялись в промежуток между start и stop
…
————-
всё верно?
P.S.:извиняюсь за баян, но только начинаю изучать python-поэтому порой такие банальные вопросы задаю. На примерах мне легче понять суть процесса.
Семён
Март 12, 2012 00:12:28
Всмысле вместо строк:
for i in files:
filter(fun1,files)
хотел написать:
for i in files:
filter(fun1(files),files)
а вместо строк:
def fun1:
#st_mtime-время создания файла(последнего изменения-“пересоздания”)
vrizm=os.stat('/file1.txt').st_mtime
хотел написать:
def fun1(file):
#st_mtime-время создания файла(последнего изменения-“пересоздания”)
vrizm=os.stat(file).st_mtime
pyuser
Март 12, 2012 05:10:50
import os, sys
import time as _time
from datetime import datetime
################################################################################
ticks = lambda x: int(_time.mktime(x.timetuple()))
# генератор имен всех файлов в директории
def file_list(root):
for fname in os.listdir():
fname = os.path.join(root, fname)
if os.path.isfile(fname):
yield fname
# генератор имен файлов, соответствующих Вашим условиям
def file_filter(files, start, stop):
for fname in files:
mtime = os.stat(fname).st_mtime
if start <= mtime <= stop:
yield fname
if "__main__" == __name__:
start = ticks(datetime.strptime(sys.argv[1], "%d.%m.%Y"))
stop = ticks(datetime.strptime(sys.argv[2], "%d.%m.%Y"))
for fname in file_filter(file_list("путь_к_папке"), start, stop):
# работаете с файлом
...
код нужно оборачивать в тег CODE, это требование специально выделено
Семён
Март 12, 2012 07:28:09
Что-то Вы меня поздапутали(((
:
Примерная структура директории такова(но на самом деле логово очень много):
/logi
|-katalog1
| |log1.fdt
|-kftflog2
| |-log3.fkp
| |-log4.ftg
|-log5,guh
У меня сейчас так пока реализовано:
скрипт запускаю так:#python script.py /logi 11.03.2012 12.03.2013
———————————————————————-
#Включаем необходимые модули
import os,sys,time
import time as _time
from datetime import datatime
#Прописываем функцию по формированию списка имён каталогов в директории(в ней несколько каталогов может быть в которых хранятся #логи и просто #могут в корне храниться логи)
def get_dir_names(path):
return
#Прописываем функцию,которая формирует файлы в конкретном заданном каком-нибудь каталоге
def get_file_names(path):
return
#Прописываем функцию,которая выводт ряд сообщений+много всего делает вообщем,но из неё все остальные функции вызываются
def fun1(pth):
g=0
ticks = lambda x: int(_time.mktime(x.timetuple()))
start = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
stop = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
files=
drs=
#создаём список всех файлов во всей директории
files=get_file_names(pth)
#создаём список всех каталогов в директории
drs=get_dir_names(pth)
d=os.listdir(pth)
for i in d:
if i in files:
files.append(i)
else:
drs.append(i)
for root,drs,files in os.walk(pth):
for f in files:
fn=os.path.join(root,f)
if os.path.islink(fn):
continue
with open(fn,'rb') as f:
#считывем первые 10 байт файла
dannie=f.read(10)
#если данных нет,но перенсети файлв корень /
if dannie=='':
shutil.move(fn,'/')
g=g+1
#прогоняем функцию fun1 по всем каталогам директории заданной вызывателем скрипта
for i in drs:
fun1(i)
print “Всего перенсено %s”%g
#сам код скрипта непосредсвенно
if len(sys.argv)<2:
print ‘Директория не задана’
else:
fun1(sys.argv)
—————————————
а вот так я понимаю мне нужно сделать,верно?:
——————–
———————————————————————-
#Включаем необходимые модули
import os,sys,time
import time as _time
from datetime import datatime
#Прописываем функцию по формированию списка имён каталогов в директории(в ней несколько каталогов может быть в которых хранятся #логи и просто #могут в корне храниться логи)
def get_dir_names(path):
return
#Прописываем функцию,которая формирует файлы в конкретном заданном каком-нибудь каталоге
def get_file_names(path):
return
# прописываем функцию,которая видоизменяет список из всех файлов оставляет лишь те файлы в списке, которые соответствуют условиям #отбора в данному случае время изменения файла должно входитьв период времени заданным
def file_filter(files, start, stop):
for fname in files:
mtime = os.stat(fname).st_mtime
if start <= mtime <= stop:
yield fname
#Прописываем функцию,которая выводт ряд сообщений+много всего делает вообщем,но из неё все остальные функции вызываются
def fun1(pth):
g=0
if “__main__” == __name__:
ticks = lambda x: int(_time.mktime(x.timetuple()))
start = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
stop = ticks(datetime.strptime(sys.argv, “%d.%m.%Y”))
files=
drs=
#создаём список всех файлов во всей директории
files=get_file_names(pth)
#создаём список всех каталогов в директории
drs=get_dir_names(pth)
d=os.listdir(pth)
for i in d:
if i in files:
files.append(i)
else:
drs.append(i)
for root,drs,files in os.walk(pth):
for fname in file_filter(file_list(root), start, stop):
for f in files:
fn=os.path.join(root,f)
if os.path.islink(fn):
continue
with open(fn,'rb') as f:
#считывем первые 10 байт файла
dannie=f.read(10)
#если данных нет,но перенсети файлв корень /
if dannie=='':
shutil.move(fn,'/')
g=g+1
#прогоняем функцию fun1 по всем каталогам директории заданной вызывателем скрипта
for i in drs:
fun1(i)
print “Всего перенсено %s”%g
#сам код скрипта непосредсвенно
if len(sys.argv)<2:
print ‘Директория не задана’
else:
fun1(sys.argv)
—————————————
так?
pyuser
Март 12, 2012 08:21:13
Семён
#Прописываем функцию по формированию списка имён каталогов в директории(в ней несколько каталогов может быть в которых хранятся #логи и просто #могут в корне храниться логи)
def get_dir_names(path):
return
#Прописываем функцию,которая формирует файлы в конкретном заданном каком-нибудь каталоге
def get_file_names(path):
return
Вы пробовали распечатать результат работы этих функций?
строку if “__main__” == __name__: не стоит вставлять в функцию
дальше вообще на бред похоже, я же Вам все написал, Вам всего лишь нужно было изменить функцию file_list
вот код, реализующий функционал из Вашего последнего поста
import os, sys
import shutil
import time as _time
from datetime import datetime
ticks = lambda x: int(_time.mktime(x.timetuple()))
# генератор имен всех файлов в директории
def file_list(root):
join = os.path.join
islink = os.path.islink
for path, dirs, files in os.walk(os.path.abspath(root)):
for filename in files:
filename = join(path, filename)
if not islink(filename):
yield filename
# генератор имен файлов, соответствующих Вашим условиям
def file_filter(files, start, stop):
for fname in files:
stat = os.stat(fname)
if start <= stat.st_mtime <= stop:
yield fname, stat.st_size
def main(root, start, stop):
move_count = 0
for fname, size in file_filter(file_list(root), start, stop):
if not size:
shutil.move(fname, "/")
move_count += 1
print("Всего перенесено {}".format(move_count))
if "__main__" == __name__:
# тут конечно же нужно сделать проверку на количество и качество
# переданных параметров, для этого есть модуль argparse - осваивайте
root = sys.argv[1]
start = ticks(datetime.strptime(sys.argv[2], "%d.%m.%Y"))
stop = ticks(datetime.strptime(sys.argv[3], "%d.%m.%Y"))
main(root, start, stop)
Семён
Март 13, 2012 04:53:49
Попробовал Ваш вариант-работает!Спасибо!
Только вот,а если я хотел бы не удалять эти логи, а допустим сохранить их в другой директории, причём так,чтобы иерархическая структура сохранилась в этой директории куда перемещаю лтот или иной лог.
Допустим имеем сл картину:
1) log1 храниться в диретории /temp/logi/PVM1/13022011/log1.ftr
2)log56 храниться в диретории /temp/logi/PVM45/15012012/log56.ftf
3)log33 храниться в диретории /temp/logi/PVM1/13022011/log33.trs
Соответсвенно эти логи попадают под условие start <= stat.st_mtime <= stop
и их нужно переместить допустим в директорию /arhiv/
1)лог log1 соответственно должен переместиться в /arhiv/PVM1/13022011/log1.ftr
2)лог log56 соответственно должен переместиться в /arhiv/PVM45/15012012/log56.ftf
3)лог log33 соответственно должен переместиться в /arhiv/PVM1/13022011/log33.trs
Я так полагаю необходимо перед перемещением для данного случая к примеру сначала перед перемещением лога,создать в диретории /arhiv соответсвующие каталоги,а уже потом перемещать,иначе иерархическая структура не будет сохранена((
как тогда быть?
Если как в моём посте выше, то это можно было достичь путём сл строк:
#Обьявляем функцию по работе с каталогами
def get_dir_names(path):
return
…..
def fun1(pth):
….
g=0
d=os.listdir(pth)
drs=get_dir_names(pth)
for i in d:
if i in files:
files.append(i)
else:
drs.append(i)
for root,drs,files in os.walk(pth):
for f in files:
fn=os.path.join(root,f)
if os.path.islink(fn):
continue
with open(fn,'rb') as f:
#запоминаем название каталога 1-го уровня
urov1=re.search(r'/d+++',fn)
if urov1:
a=urov1.group()
urov2=re.search(r'/d+++++++',fn)
#запоминаем название каталога 2-го уровня
if urov2:
b=urov2.group()
#считываем первые 10 байт лога
dannie=f.read(10)
print dannie
#создаём соответсвующие каталоги в директории /arhiv
path2=str('/arhiv/%s'%a+'/%s'%b)
#создаём каталог 1-го уровня
if not os.path.exist('/arhiv/%s'%a):
os.mkdir('/arhiv/%s'%a)
print ‘Создали каталог 1-го уровня’
if not os.path.exist(path2):
os.mkdir(path2)
#переносим файл:
shutil.move(fn,path2)
g+=1
print ‘Файл %s’%fn+' был перемещён в диретоорию: %s'%path2
#Прогоняем функцию fun1 по всем каталогам диреткории /temp/logi
for i in drs:
fun1(i)
print ‘Всего перенесено %s’%g
fun1('/temp/logi/'')
———————–
а как в вашем случае это можно реализовать?
Семён
Март 13, 2012 04:59:08
Немного ещё поясню:
считывание первых 10 быйт файла,который удовлетворяет условиям перемещения мне просто нужно для аналза в консоле-так сказать справочная информация и не более того
———————————————–
#считываем первые 10 байт лога
dannie=f.read(10)
print dannie
————————————
pyuser
Март 13, 2012 06:35:49
Вы в моем коде видели что-либо подобное Вашему path2=str('/arhiv/%s'%a+'/%s'%b)? В одной из соседних веток Вам совершенно справедливо указали на то, что Вы не на ПХП пишите. Загляните в справку по питону. Вам понадобятся функции dirname, isdir, join, relpath, makedirs и move из shutil.
ЗЫ. Ваша функция get_dir_names возвращает не список вложенных папок, как Вы ожидаете, а список булевых величин (я предлагал Вам распечатать результат ее работы)
ЗЫЫ. Прочтите наконец объявление в заголовке этой страницы - Ваши посты абсолютно не читабельны