148 lines
5.7 KiB
Python
Executable file
148 lines
5.7 KiB
Python
Executable file
# 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)
|