# met à jour un fichier de suivi pour chaque livre # le suivi se fait dans un fichier csv où chaque ligne est un compte rendu de statistiques du livre # colonnes du csv: date; mots; intrigues; personnages; personnages_mots; import csv import os from datetime import date, timedelta, datetime def mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages): # Lire le fichier livre.org with open(fichier_livre, 'r') as f: contenu_livre = f.read() mots_livre = len(contenu_livre.split()) chapitres = contenu_livre.count('* ') sous_chapitres = contenu_livre.count('** ') + contenu_livre.count('*** ') + contenu_livre.count('**** ') # Lire le fichier personnages.org with open(fichier_personnages, 'r') as f: contenu_personnages = f.read() personnages_mots = len(contenu_personnages.split()) personnages = contenu_personnages.count('* ') # Récupérer les valeurs pour les autres colonnes intrigues = 5 # Mettre à jour le fichier de suivi # Vérifier si le fichier existe et s'il commence par un commentaire file_exists = os.path.exists(fichier_csv) needs_comment = False if not file_exists: needs_comment = True else: with open(fichier_csv, 'r') as f: first_line = f.readline().strip() if not first_line.startswith('#'): needs_comment = True if needs_comment: # Sauvegarder le contenu existant si le fichier existe content = "" if file_exists: with open(fichier_csv, 'r') as f: content = f.read() # Réécrire le fichier avec un commentaire en tête with open(fichier_csv, 'w', newline='') as f: f.write('# Ce fichier est un CSV et ne doit pas être exécuté directement avec Python.\n') f.write('# Utilisez view_suivi_livre.py pour visualiser ces données.\n') if content: # Si le contenu commence par un commentaire, on le supprime # pour éviter la duplication if content.startswith('#'): lines = content.split('\n') # Trouver la première ligne qui n'est pas un commentaire ou une ligne vide for i, line in enumerate(lines): if not line.strip().startswith('#') and line.strip(): content = '\n'.join(lines[i:]) break f.write(content) # Ajouter la nouvelle ligne with open(fichier_csv, 'a', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=';') now = datetime.now() ligne = [now.isoformat(), mots_livre, intrigues, personnages, personnages_mots, chapitres, sous_chapitres] writer.writerow(ligne) # Exemple d'utilisation fichier_csv ='suivi_livre.csv' fichier_livre = 'livre.org' fichier_personnages = 'personnages.org' def analyse_csv(fichier_csv): with open(fichier_csv, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=';') donnees = [] for row in reader: # Ignorer les lignes de commentaire qui commencent par # if row and not row[0].startswith('#'): donnees.append(row) # Si aucune donnée valide n'a été trouvée, retourner if not donnees: print("Aucune donnée valide trouvée dans le fichier CSV.") return # Récupérer les dates et les nombres de mots dates = [datetime.fromisoformat(donnee[0]).date() for donnee in donnees] mots = [int(donnee[1]) for donnee in donnees] # Récupérer la date du jour aujourd_hui = date.today() oldest_count=0 hier = aujourd_hui - timedelta(days=1) semaine_derniere = aujourd_hui - timedelta(days=7) mois_dernier = date(aujourd_hui.year, aujourd_hui.month - 1, aujourd_hui.day) # Récupérer la valeur des mots la plus récente parmi celles de la date du jour mots_aujourd_hui = 0 mots_aujourd_hui_start = 0 most_recent = 0 # print("suivis: ",len(dates)) most_recent = mots[len(dates)-1] for i, date_ in enumerate(dates): # trouver le premier décompte supérieur à 0 if mots[i] > 0 and oldest_count == 0: oldest_count = mots[i] # print('oldest: ',oldest_count, " mots") if date_ == aujourd_hui: if mots_aujourd_hui_start == 0: mots_aujourd_hui_start = mots[i] print('au début du jour:' , mots_aujourd_hui_start) if date_ == aujourd_hui: mots_aujourd_hui = mots[i] # Récupérer la valeur des mots la plus récente du jour précédent mots_hier = 0 for i, date_ in enumerate(dates): if date_ == hier: mots_hier = mots[i] break # Récupérer la valeur des mots la plus récente de la semaine dernière mots_semaine_derniere = 0 for i, date_ in enumerate(dates): if semaine_derniere <= date_ < aujourd_hui: mots_semaine_derniere = mots[i] break # Compter le nombre de mots changés aujourd'hui mots_changés_aujourd_hui = most_recent - mots_aujourd_hui_start # Compter le nombre de mots changés depuis la date la plus récente dans la semaine dernière mots_changés_semaine_derniere = mots_aujourd_hui_start - mots_semaine_derniere # Afficher le résultat print("Nombres de mots changés aujourd'hui : ", mots_changés_aujourd_hui) print("Nombres de mots changés depuis la date la plus récente dans la semaine dernière : ", mots_changés_semaine_derniere) print("Total : ", most_recent," mots") mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages) analyse_csv(fichier_csv)