В дополнение к перечислении файлов в указанном пути, а затем фильтровать файлы, которые только нулевой длины, вы, вероятно, хотите сохранить некоторый тип государства, чтобы обеспечить вы не уведомляются несколько раз того же файла нулевой длины. То есть вы, вероятно, не хотите получать уведомление о том, что один и тот же файл имеет длину до бесконечности (хотя вы можете изменить приведенный ниже пример, если хотите это поведение).
Возможно, вы захотите сделать что-то вроде проверки того, что имя файла строго соответствует вашему соглашению об именах. Вы также можете подтвердить, что строковая метка даты, включенная в имя файла, является допустимым дата-временем.
В приведенном ниже примере используется модуль glob (сам по себе использует os.listdir()
и fnmatch.fnmatch()
) для создания набора возможных файлов для включения. [1]
Пример преднамеренно прост и использует один класс для хранения журнала «состояние». KEEP_SAMPLES
образцов сохраняются (экземпляры logState()
в log_states
списке, достигаются с помощью списка нарезки
Одна alert(msg)
функции поставляются в виде заглушки на то, что может отправить почту, и т.д ...
Ссылки:.
[1] https://docs.python.org/3.2/library/glob.html
#!/usr/bin/python3
import os
import glob
import re
from datetime import datetime, timezone
import time
from pprint import pprint
class logState():
def __init__(self, log_path, glob_patt, re_patt, dt_fmt):
self.dt = datetime.now(timezone.utc)
self.log_path = log_path
self.glob_patt = glob_patt
self.re_patt = re_patt
self.dt_fmt = dt_fmt
self.empty_logs = []
self.nonempty_logs = []
# Retrieve only files from glob
self.files = [ f for f in
glob.glob(self.log_path + self.glob_patt)
if os.path.isfile(f) ]
for f in self.files:
unq_fname = f.split('/')[-1]
if unq_fname == None:
continue
# Tighter pattern matching
if re.match(re_patt, unq_fname) == None:
continue
# Get the datetime portion of the file name
f_dtstamp = unq_fname.split('.')[-1]
# Make sure the datetime stamp represents
# a valid date
if datetime.strptime(f_dtstamp, self.dt_fmt) == None:
continue
# Check file size, add to the appropriate
# list
if os.path.getsize(f) <= 0:
self.empty_logs.append(f)
else:
self.nonempty_logs.append(f)
def alert(msg):
print("ALERT!: {0}".format(msg))
if __name__ == "__main__":
# How long to sleep
SLEEP_SECS = 5
# How many samples to keep
KEEP_SAMPLES = 5
log_states = []
# Definition for what logs states we'll look for
log_path = './'
glob_patt = 'nfcapd.[0-9]*'
re_patt = 'nfcapd.([0-9]{12})'
dt_fmt = "%Y%m%d%H%M"
print("-- Setup --")
print("Sample files in '{0}'".format(log_path))
print("\t{0} samples kept:".format(KEEP_SAMPLES))
print("\tglob pattern: '{0}'".format(glob_patt))
print("\tregex pattern: '{0}'".format(re_patt))
print("\tdatetime string: '{0}'".format(dt_fmt))
print("")
# Collect the initial state
log_states.append(logState(log_path,
glob_patt,
re_patt, dt_fmt))
while True:
# Print state inventory and current state detail
print("-- Log States Stored --")
for i, log_state in enumerate(log_states):
print("Log state {0} @ {1}".format(i, log_state.dt))
print(" -- Logs size > 0 --")
pprint(log_states[-1].nonempty_logs)
print(" -- Logs size <= 0 --")
pprint(log_states[-1].empty_logs)
print("")
time.sleep(SLEEP_SECS)
log_states = log_states[-KEEP_SAMPLES+1:]
log_states.append(logState(log_path,
glob_patt,
re_patt,
dt_fmt))
# p = previous sample, c = current
p = set(log_states[-2].empty_logs)
c = set(log_states[-1].empty_logs)
# only report the items in the current sample
# not in the last
if len(c.difference(p)) > 0:
alert("\nNew zero length logs: " + str(c.difference(p)) + "\n")
'os.listdir()' является вашим другом, как это 'модуль stat' – user2085282
Я думаю, что я имею больше трудностей выясняя, как искать имя файла в зависимости от времени. –
'os.listdir()' дает вам список всех имен файлов, 'x in y' сообщает вам, есть ли строка x в строке y. Получите список имен и строковое представление времени. Прочтите документацию для модуля 'time' для этого последнего. Этого должно быть достаточно. – user2085282