1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| # -*- coding: utf-8 -*-
# Python 3
import os
from datetime import datetime, timedelta, date
from fnmatch import fnmatch
class Filtrewildcard(object):
"""Dit si le nom de fichier donné satisfait le motif wildcard donné
Le motif (type str) peut être plusieurs motifs séparés par des ';'
Le fichier peut être donné avec ou sans son chemin
"""
#========================================================================
def __init__(self, motif="*"):
self.motifs = motif.split(';') # plusieurs motifs séparés par ';'
#========================================================================
def __call__(self, fichier):
nomfichier = os.path.basename(fichier) # élimine le chemin s'il y est
for motif in self.motifs:
if fnmatch(nomfichier, motif):
return True # on a trouvé un motif qui marche!
return False # aucun des motifs donnés n'a été satisfait
class Filtredate(object):
"""Filtre un fichier (avec son chemin) selon sa date de modification.
La date dtime est donnée en type datetime: dtime=datetime(an,mois,jour)
Les comparaisons de date ne tiennent pas compte des heures
"""
#========================================================================
def __init__(self, dtime=None):
if dtime==None:
self.datecible = date.today() # on prend la date d'aujourd'hui
else:
self.datecible = dtime.date()
self.epoch = datetime.utcfromtimestamp(0) # calcul de l'epoch de l'OS
#========================================================================
def apres(self, fichier):
"""Dit si le fichier a été modifié à la date dtime ou après
"""
tempsfichier = os.path.getmtime(fichier)
dtimefichier = (self.epoch + timedelta(seconds=tempsfichier))
return dtimefichier.date() >= self.datecible
class Cherchefichiers(object):
"""Permet de trouver tous les fichiers d'un répertoire et de ses
sous-répertoire qui répond à des tests de filtrage
"""
#========================================================================
def __init__(self, repertoire=""):
# Enregistre le répertoire fourni après sa normalisation
self.repertoire = os.path.abspath(os.path.expanduser(repertoire))
# initialise la liste des erreurs consultable en fin de recherche
self.listerreurs = []
#========================================================================
def fnerreurs(self, msgerr):
"""Reçoit et enregistre les éventuels messages d'erreur de os.walk
"""
self.listerreurs.append([msgerr.errno, msgerr.strerror, msgerr.filename])
#========================================================================
def cherche(self, filtre=None):
"""Trouve les fichiers du répertoire et de ses sous-répertoires
qui satisfont le filtre donné
"""
if filtre==None:
filtre = lambda x: True # sans filtre donné, on accepte tout
self.listerreurs = [] # remet à vide la liste des erreurs
for repert, sreps, fics in os.walk(self.repertoire, onerror=self.fnerreurs):
for fic in fics:
fichier = os.path.join(repert, fic) # ajout du chemin
try:
os.path.getsize(fichier) # uniquement pour valider l'accès
if filtre(fichier):
yield fichier
except OSError as msgerr:
self.fnerreurs(msgerr)
# répertoire de recherche
repertoire = r"C:\Python34"
# filtre par wildcard: on cherche tous les scripts Python
filtrenom = Filtrewildcard("*.py;*.pyw")
# filtre par date: ici c'est le 17/5/2016 et après
filtredate = Filtredate(datetime(2016,5,17)).apres
# combine les 2 filtres
filtre = lambda f: filtrenom(f) and filtredate(f)
# cherche et affiche les fichiers satisfaisant aux filtres
fichiers = Cherchefichiers(repertoire)
nb = 0 # compteur
for fichier in fichiers.cherche(filtre):
datefichier = (datetime.utcfromtimestamp(0) + timedelta(seconds=os.path.getmtime(fichier))).strftime('%Y-%m-%d')
print(fichier, datefichier) # on ajoute la date du fichier seulement pour vérifier
nb += 1
print()
print("Nombre de fichiers trouvés:", nb)
print()
# on affiche les erreurs s'il en a
if fichiers.listerreurs==[]:
print("Aucune erreur")
else:
print(len(fichiers.listerreurs), "Erreurs trouvées:")
for erreur in fichiers.listerreurs:
print(erreur) |
Partager