IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème à l'écriture d'un fichier de données


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut Problème à l'écriture d'un fichier de données
    Bonjour à tous,

    J'ai plusieurs scripts python qui enregistrent des données de domotique, et ce en continu. Ils enregistrent ces données dans des fichiers correspondants. Chaque mois un nouveau dossier est crée pour y mettre les données du mois.
    Ces dossiers sont créés par le script suivant, chaque 26 du mois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    import glob
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import os
    import time
    from datetime import datetime
    from pathlib import Path
     
     
    #Définition de la date sous la forme "MoisAnnee" en français.
    current_datetime = datetime.now()
    current_date = current_datetime.strftime("%B%Y") 
    #print(current_date)
    Mois=['janvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre']
    mois = current_datetime.date().month
    #print(Mois[mois])
    Q = Mois[mois]
    #print(Q)
    current_date = Q + current_datetime.strftime("%Y") 
    #print(current_date)
     
     
    #Creation des dossiers de donnees pour la domotique et la meteo.
     
    Source_dir_Chaudiere = '/home/pi/Domotique/Donnees_Chaudiere/' + current_date
    Source_dir_Temperature = '/home/pi/Domotique/Donnees_Temperature/' + current_date
    Source_dir_Meteo = '/home/pi/Domotique/Donnees_Meteo/' + current_date
    Source_dir_ECS = '/home/pi/Domotique/Gestion_ECS/' + current_date
    Source_dir_Radiateurs = '/home/pi/Domotique/Gestion_Radiateurs/' + current_date
     
    #Creation des dossiers
    try:
        os.mkdir(Source_dir_Chaudiere, 0o777)
    #    os.chmod(Source_dir_Chaudiere, 0o0700)
        os.mkdir(Source_dir_Temperature, 0o777)
    #    os.chmod(Source_dir_Temperature,0o0700)
        os.mkdir(Source_dir_Meteo, 0o777)
    #    os.chmod(Source_dir_Meteo, 0o0700)
        os.mkdir(Source_dir_ECS, 0o777)
    #    os.chmod(Source_dir_ECS, 0o0700)
        os.mkdir(Source_dir_Radiateurs, 0o777)
     
    except PermissionError:
        print("Permission denied")
    except FileExistsError:
        print("Problème durant le processus de construction de dossiers")
    #f.close()
    le script fonctionne et les dossiers sont créés. Mais quand arrive le premier jour du mois suivant à minuit les programmes qui enregistrent les données ne basculent pas sur les nouveaux dossiers. Il faut que je relance le Pi et là pas de souci les nouveaux fichiers apparaissent dans les bons dossiers.
    En soi je pourrais programmer un reboot du Pi chaque premier du mois à minuit pour régler le problème mais j'aimerais bien comprendre pourquoi la bascule ne se fait pas.

    Pourriez-vous m'aider ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 887
    Points : 7 236
    Points
    7 236
    Par défaut
    Bonjour,

    Citation Envoyé par Toine74
    Mais quand arrive le premier jour du mois suivant à minuit les programmes qui enregistrent les données ne basculent pas sur les nouveaux dossiers.
    Je pense que c'est ce script qui serait intéressant de voir, et non celui que vous proposez...

    Citation Envoyé par Toine74
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    except FileExistsError:
        print("Problème durant le processus de construction de dossiers")
    Ce n'est pas un problème c'est juste logique et normal.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 199
    Points : 4 659
    Points
    4 659
    Par défaut
    bonjour

    Effectivement tu ne nous donnes pas le bon script
    Je suppose que tu as une boucle , il te faut donc malheureusement controler que le fichier log est le bon avant chaque écriture !
    ok : c'est clairement pas génial question perfo (et peut être compliqué si 36 boucles avec 36 tâches en //).
    Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    f = open(log/tonmois2000.txt)
    mois_courant = 5
    while True:   # ATTENTION boucle dure plusieurs mois !!
        if date.today().month != mois_courant: 
           # ? lock les autres taches ?
           close(f); 
           # eventuellement créer ici le répertoire si non trouvé (comme code lancé le 26)
           f = open(nouveau moisAn)  
           mois_courant = date.today().month
     
          # OU ... sortir de la boucle et relancer ton script au début
     
        f.write(data)

    Note: Ton script (peut être inutile) me semble extremement compliqué (de + pas bon car pas d'incrément de l'année...), pas plus simple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/usr/bin/env python
    import locale
    from datetime import date, timedelta
    import os
     
    locale.setlocale(locale.LC_TIME, "fr_FR")
     
    ROOT = "/home/pi/Domotique"
    DIRS = (
        "Donnees_Chaudiere",
        "Donnees_Temperature",
        "Donnees_Meteo"
    )
     
    if __name__ == "__main__":
     
        next = date.today() + timedelta(days=30)  # si en décembre -> incrément année ;)
        next = f"{next:%B%Y}"
     
        for dir in DIRS:
            directory = f"{ROOT}/{dir}/{next}"
            # try ...
            os.mkdir(directory)
    $moi= ( !== ) ? : ;

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Ah pardon autant pour moi...

    Une fois le Pi redémarré, les différents scripts (qui démarrent automatiquement avec le Pi) créent leurs fichiers de données respectifs dans les bons dossiers et ils les remplissent sans anicroche durant tout le mois. Et si je supprime un des fichiers alors le script en crée un nouveau et le remplit aussitôt. C'est uniquement la transition vers le dossier du mois suivant qui ne se fait pas. Et comme c'est ce script qui les fabrique j'ai crû que c'était lui le fautif et que c'était un problème de droits d'accès.

    Voilà un des scripts qui collecte les données de température :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    import glob
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import os
    import time
    from datetime import datetime
    from pathlib import Path
     
     
     
     
    sonde_chambre = '/28-00000c86ab42'
    sonde_ecs = '/28-04168632a0ff'
    sonde_salon = '/28-00000c376062'
     
    base_dir = '/sys/bus/w1/devices'
    sonde_chambre = base_dir + '/28-00000c86ab42/w1_slave'
    sonde_salon = base_dir + '/28-00000c376062/w1_slave'
    sonde_ecs = base_dir + '/28-04168632a0ff/w1_slave'
        #Definition de la date sous la forme "MoisAnnee" en franc§ais.
    current_datetime = datetime.now()
    current_date = current_datetime.strftime("%B%Y") 
        #print(current_date)
    Mois=['janvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre']
    mois = current_datetime.date().month
        #print(Mois[mois])
    Q = Mois[mois-1]
        #print(Q)
    current_date = Q + current_datetime.strftime("%Y") 
        #print(current_date)
     
     
    #definition du repertoire de base qui change chaque mois et ou les donnees sont enregistrees
    Record_dir = '/home/pi/Domotique/Donnees_Temperature/' + current_date
    Record_file = Record_dir + f"/{current_date}.txt"
    print(Record_file)
    def Ouverture_Lecture_Fichiers_Temp(sonde):
        #    while not os.path.exists("sonde"):
        #        time.sleep(10)    
        f_sonde = open(sonde, 'r')
        lines_sonde = f_sonde.readlines()
        return lines_sonde
        f_sonde.close()
     
    def extraire_temperature (sonde):
        lines = Ouverture_Lecture_Fichiers_Temp(sonde)
        while lines == []:
            time.sleep(0.5)
                #print('pas de donnees')
            lines = Ouverture_Lecture_Fichiers_Temp(sonde)
        donnees_temperature = lines[1].split(" ")[9]
        Temp = float(donnees_temperature[2:]) / 1000
        return Temp
     
    #print(Record_dir)
    #print(Record_file)
    file_exists = os.path.isfile(Record_file)
    #print(file_exists)
    #print(current_datetime.strftime("%d-%m-%Y %H:%M:%S"))
     
    while True :
        Temp_Salon = extraire_temperature (sonde_salon)
        Temp_Chambre = extraire_temperature (sonde_chambre)
        Temp_ECS = extraire_temperature (sonde_ecs)
     
        print(Temp_Salon)
        print(Temp_Chambre)
        print(Temp_ECS)
        try:
            # Obtenir la date et l'heure actuelles
            current_datetime = datetime.now()
            current_date = current_datetime.strftime("%B%Y") 
            #print(current_date)
            Mois=['janvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre']
            mois = current_datetime.date().month
            #print(Mois[mois])
            Q = Mois[mois-1]
            #print(Q)
            current_date = Q + current_datetime.strftime("%Y") 
            #definition du repertoire de base qui change chaque mois et ou les donnees sont enregistrees
            Record_dir = '/home/pi/Domotique/Donnees_Temperature/' + current_date
            Record_file = Record_dir + f"/{current_date}.txt"
    #        current_date = current_datetime.strftime("%Y-%m-%d")
            current_time = current_datetime.strftime("%H:%M:%S")
     
            # Former le nom du fichier en fonction du mois et de l'annee
            Record_file = Record_dir + f"/{current_date}.txt"  
    #        csv_file = fbase_dir + "/{current_date}.txt"  
            print(Record_file)
            # Preparer les donees pour le fichier CSV
            current_date = current_datetime.strftime("%d-%m-%Y")
            # Parser le contenu XML
            root = {"Temp_Salon": Temp_Salon,"Temp_Chambre": Temp_Chambre,"Temp_ECS": Temp_ECS}
            data_to_write = {"Date": current_date, "Heure": current_time}
            #print(data_to_write)
            data_to_write.update(root)
            #print(data_to_write.update(root))
            # Verifier si le fichier existe pour ecrire l'en-tete ou non
            file_exists = os.path.isfile(Record_file)
     
            with open(Record_file, "a", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
     
                # Ecrire l'en-tete si le fichier est nouveau
                if not file_exists:
                    writer.writeheader()
     
                # Ecrire les donnees
                writer.writerow(data_to_write)
     
        except HTTPError as e:
            print(f"Erreur HTTP : {e.code} {e.reason}")
     
        except URLError as e:
            print(f"Erreur d'URL : {e.reason}")
     
        except etree.XMLSyntaxError as e:
            print(f"Erreur de syntaxe XML : {e}")
     
        f.close()
        time.sleep(30)

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 199
    Points : 4 659
    Points
    4 659
    Par défaut
    Ton code est juste bon pour tester un concept, mais certainement pas pour de la production

    - ferme des fichiers quand c'est inutile et ne ferme pas lorsqu'il le devrait
    - des redondances à la pelle, génial pour avoir un code beaucoup plus compliqué qu'il ne devrait
    - lignes de codes inutiles comme les imports, exceptions
    - current_date qui change de format pendant l'exécution du code
    - bravo ! le data_to_write.update(...), si au moins un des 2 dico était calculé hors bouche
    ...

    Bref, je ne peux pas lire/comprendre ce code. (sans risquer d'avoir des cheveux blancs)

    Note:
    pour se passer de ton script lancé le 26, pourquoi ne pas faire simple ? (ligne 85) genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Record_dir = '/home/pi/Domotique/Donnees_Temperature/' + current_date
    os.makedirs(Record_dir, exist_ok=True)   # ou if existe ... mkdir
    Citation Envoyé par Toine74 Voir le message
    crû que c'était lui le fautif et que c'était un problème de droits d'accès
    Cela peut parfois arriver. Par exemple si un script est lancé en root (avec cron / systemd timer) et l'autre comme simple utilisateur (dans terminal).
    $moi= ( !== ) ? : ;

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 887
    Points : 7 236
    Points
    7 236
    Par défaut
    Citation Envoyé par Toine74
    C'est uniquement la transition vers le dossier du mois suivant qui ne se fait pas.
    Il faut ajouter une vérification dans la boucle principale pour détecter un changement de mois. Si le mois a changé, la fonction create_record_file est appelée pour créer le nouveau dossier et le nouveau fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def create_record_file():
        current_datetime = datetime.now()
        current_date = f"{Mois[current_datetime.month - 1]}{current_datetime.year}"
        record_dir = f"/home/pi/Domotique/Donnees_Temperature/{current_date}"
        os.makedirs(record_dir, exist_ok=True)
        record_file = os.path.join(record_dir, f"{current_date}.txt")
     
        return record_file
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous,
    Je reviens vers vous car le problème est toujours le même. Ce mois ci au 1er juillet le transfert vers les nouveaux dossier ne s'est toujours pas fait et quand j'ai voulu ouvrir le dossier juillet avec l'explorateur fichier j'ai eu comme réponse permission denied. Il y a donc bien un problème de droit. Est ce que ma commande de création de dossier avec les droits associés est mauvaise ?

    Merci d'avance
    Antoine

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 247
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 247
    Points : 1 820
    Points
    1 820
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Bonjour à tous,
    Je reviens vers vous car le problème est toujours le même. Ce mois ci au 1er juillet le transfert vers les nouveaux dossier ne s'est toujours pas fait et quand j'ai voulu ouvrir le dossier juillet avec l'explorateur fichier j'ai eu comme réponse permission denied. Il y a donc bien un problème de droit. Est ce que ma commande de création de dossier avec les droits associés est mauvaise ?

    Merci d'avance
    Antoine
    comme l'a évoqué papajoker en fin de sa réponse #5: selon "qui" lance chacun des scripts et des droits associés, Si c'est un problème de droits, à toi de les ajuster via le script qui créé les répertoires

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 199
    Points : 4 659
    Points
    4 659
    Par défaut
    Sans ton code, sans retours ...
    On ne sait même pas comment tu vas créer maintenant ces dossiers (tu as toujours ton script à part ?). Et tu ne nous as jamais dis sous quel user tourne ton script ?
    Par défaut, je suppose que seul le propriétaire peux modifier et seul le groupe peut y accéder ? Et donc si c'est root qui a créé , alors tout est normal.
    Un minimum est de nous retourner un ls -l
    $moi= ( !== ) ? : ;

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/06/2015, 11h04
  2. Recherche de fichiers ne donne aucun résultat
    Par clem_alain dans le forum Gnome
    Réponses: 0
    Dernier message: 20/08/2014, 10h41
  3. Lecture d'un fichier DBF > donne NULL!
    Par ElKmanter dans le forum Général Java
    Réponses: 1
    Dernier message: 02/04/2013, 09h49
  4. [FTP] fgets sur un fichier php donne du html
    Par Ralfman68 dans le forum Langage
    Réponses: 14
    Dernier message: 22/02/2007, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo