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 :

Selection d'une partie d'un fichier


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    50
    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 : 50
    Points : 6
    Points
    6
    Par défaut Selection d'une partie d'un fichier
    Bonjour à tous,

    J'ai un pb avec un script qui doit aller sélectionner une partie d'un fichier de données en vue d'en faire un graph. J'ai un fichier de données du genre : Date, Température_Salon, Température_Chambre, Température_ECS.

    Ce fichier est abondé par des mesures faites sur des sondes de température qui viennent toutes les 3s environ rajouter une ligne.

    Mon script lit d'abord le fichier pour en déterminer le nombre de ligne. Puis il lit la dernière ligne pour savoir quel jour du mois on est (je fait ça car je veux récupérer les dernières 24H de données pour en faire un graph).
    Ensuite je lis le fichier ligne par ligne en comparant le jour avec le jour trouvé sur la dernière ligne. C'est là que cela bugue car la lecture ne s'arrête pas au début du dernier jour enregistré, ça lit tout le fichier malgré la consigne...

    Voila le script :

    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
    import glob
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import sys
    import os
    import time
    from datetime import datetime
    from pathlib import Path
    import smbus as smbus
    #import file_read_backwards
     
    current_datetime = datetime.now()
    current_date = current_datetime.strftime("%B%Y") 
        #print(current_date)
    Mois=['Jjanvier','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")
    Record_dir = '/home/pi/Domotique/Donnees_Temperature/' + current_date
    Record_file = Record_dir + f"/{current_date}.txt"
    Day_File_Salon = Record_dir + f"/Data_Temp_Day_Salon.txt"
    Day_File_Chambre = Record_dir + f"/Data_Temp_Day_Chambre.txt"
    Day_File_ECS = Record_dir + f"/Data_Temp_Day_ECS.txt"
     
    print(Day_File_Salon)
    Date = 0
    Heure = 1
    Salon = 2
    Chambre = 3
    ECS = 4
     
    def Selection_Data_Plot(Data_File,Piece,Day_File):
    #Calcul du nombre de lignes dans le fichier
        with open(Data_File, 'r')as f_plot :
            total_lines = sum(1 for line in f_plot)
    #        print(total_lines)
    # Calcul du dernier jour présent dans le fichier
        with open(Data_File, 'r')as f_plot : 
            i = 0
            lines_plot = f_plot.readlines()[-1]
            Jour_Courant = lines_plot.split(",")[0].split("-")[0]
    #        print(int(Jour_Courant))
    #        print(lines_plot.split(",")[0].split("-")[0])
    #Je parcours le fichier avec un itérateur pour trouver la ligne où le dernier jour commence
        with open(Data_File, 'r')as f_plot :
            lines_plot = f_plot.readlines()[1:]
    #        print(lines_plot[1])
            Jour = int(lines_plot[1].split(",")[0].split("-")[0])
    #        print(Jour)
            while int(Jour) < int(Jour_Courant):
                for line in lines_plot:
    #                print(int(Jour_Courant))
                    Jour = line.split(",")[0].split("-")[0]
    #                print(Jour)
                    i = i + 1
                    line = f_plot.readline()
                    print(i)
    #Enregistrement des donnees
        with open(Data_File, 'r')as f_plot :
            lines_plot = f_plot.readlines()[i:total_lines]
            print(i)
            print(total_lines)
            for line in lines_plot:
                Date = line.split(",")[0:1]
                Temp_Salon = float(line.split(",")[Piece])
                with open(Day_File, "a", newline="", encoding="utf-8") as f:
                    data_to_write = {Date, Temp_Salon}
                    print(data_to_write)
                    f.write(data_to_write)
                    f.close()
                    print(i)
    data_plot_Salon = Selection_Data_Plot(Record_file,Salon,Day_File_Salon)
    Je vous mets en pièce jointe le fichier de données de température du mois en cours pour que vous puissiez tester le code.
    J'ai un peu du mal à comprendre pourquoi il ne sélectionne pas les données demandées, pouvez-vous m'aider ?

    Merci par avance à tous.

    février2024.odt

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Toine74 Voir le message
    Je vous mets en pièce jointe le fichier de données de température du mois en cours pour que vous puissiez tester le code.
    Ton fichier c'est du odt. Et un fichier "odt" (OpenOffice Document Text) ce n'est pas du texte (me semble que c'est du xml zippé).
    Donc tu ne peux pas le prendre comme un fichier texte style "le lire ligne à ligne"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    50
    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 : 50
    Points : 6
    Points
    6
    Par défaut
    je l'ai transformé en .odt pour pouvoir le mettre en pièce jointe, (trop gros pour être accepté en l'état par le site) le fichier d'origine est un .txt

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Donc tu transformes un truc utile en autre chose juste pour pouvoir le déposer sur le site ? Et à quoi ça va nous servir à nous ???
    Alors voilà vous m'avez commandé une pizza mais comme elle était trop grande pour mes boites je vous ai mis un muffin à la place...

    Ton .txt tu le zippes !!! Ou alors tu n'en mets qu'un extrait...

    Ceci dit, en attendant...
    Citation Envoyé par Toine74 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from datetime import datetime
    current_datetime = datetime.now()
    current_date = current_datetime.strftime("%B%Y") 
        #print(current_date)
    Mois=['Jjanvier','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")
    Alors tu crées une date+heure où tu extrais le mois et l'année. Puis ce mois+année tu le convertis en date pour avoir cette fois le quantième du mois que tu convertis en mois français, que tu réassocies alors à la date et heure du début pour cette fois en extraire l'année...
    Nom : image1.png
Affichages : 135
Taille : 9,6 Ko

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from datetime import date
    mois=(
    	'janvier', 'février', 'mars', 'avril',
    	'mai', 'juin', 'juillet', 'aout',
    	'septembre', 'octobre', 'novembre', 'décembre',
    )	# Pas besoin de liste quand un tuple suffit (et aérer ne fait pas de mal)
    today = date.today()
    current_date = "%s%s" % (
    	mois[today.month - 1],
    	today.strftime("%Y"),
    )
    Nom : image2.png
Affichages : 134
Taille : 500 octets
    Accessoirement ce "décembre" semble indiquer que tu ne travailles pas en utf-8
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 808
    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 808
    Points : 7 086
    Points
    7 086
    Par défaut
    @Toine74,

    Il y a beaucoup d'erreurs, beaucoup de manques de logique de programmation (par ex. vous lisez 3x le même fichier avec readlines).

    Dans la boucle où vous tentez de trouver la ligne à partir de laquelle commencer à lire les données pour le dernier jour, vous utilisez à la fois une boucle while et une boucle for imbriquée sans réinitialiser correctement Jour à chaque itération de la boucle for. Cela entraîne une comparaison incorrecte et potentiellement infinie si la condition while ne devient jamais fausse.

    Lorsque vous essayez d'écrire les données filtrées dans un nouveau fichier, vous utilisez f.write(data_to_write), mais data_to_write est un ensemble (dénoté par {}), ce qui n'est pas supporté par f.write() qui attend une chaîne de caractères. De plus, vous n'avez pas converti Date et Temp_Salon en une chaîne formatée correctement avant de tenter de l'écrire.
    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)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Mon script lit d'abord le fichier pour en déterminer le nombre de ligne. Puis il lit la dernière ligne pour savoir quel jour du mois on est (je fait ça car je veux récupérer les dernières 24H de données pour en faire un graph).
    Vu que vous recherchez les lignes du même jour que la dernière ligne (et que les lignes sont ajoutées au fichier avec un horodatage croissant) autant parcourir les lignes depuis la fin jusqu'à rencontrer une ligne d'un jour différent.
    Mine de rien à la fin du mois, çà fait 29*#mesures_jours comparaisons de moins à faire et une durée de traitements moins dépendante du jour du mois.

    Ceci dit, pour faire des traitements journaliers, stocker un fichier par jour serait peut être une solution.

    Après triturer des fichiers CSV avec plein de données fait tout l'intérêt de bibliothèques telles que pandas.
    Écrire des codes aussi basiques n'a d'intérêt que pour s'entraîner à apprendre à programmer (mais on commence avec des jeu de données beaucoup plus simples pour comprendre le code qu'on écrit).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    50
    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 : 50
    Points : 6
    Points
    6
    Par défaut
    @ Sve@r : Et ouvrir le .odt avec open office pour le réenregistrer en .txt ça te parait insurmontable ?? Je mets le .txt zippé en pièce jointe pour sa majesté. Quand au calcul de la date merci pour le code. Hé oui je suis débutant, je ne connais pas toutes les ficelles et les procédures alors je fais comme je peux et j’apprends petit à petit. Je ne suis pas programmeur.

    février2024.zip


    @Fred Je ré-ouvre plusieurs fois le fichier car sinon certaines variables donnaient 0 (comme par exemple jour_Courant dans la deuxième ouverture). Si je n'ouvre le fichier qu'un seul fois avec un simple open sans le with ça devrait résoudre le problème non ? Quand à la boucle je pense bien qu'il y a un pb dedans mais je n'arrive pas à comprendre où car quand je lance le programme avec les print(Jour_Courant) (ligne (57) et print(Jour) (ligne 59) non mis en commentaire les jours défilent bien mais il ne s'arrête pas quand il arrive au jour demandé.

    @wiztriks. Au début c'est ce que je voulais faire, c'est sûr que c'est bien plus efficace. Mais le pb de la sélection du jour via la boucle while reste le même. J'ai commencé par essayer avec reverse() mais j'avais plein d'erreurs et je ne m'en sortait pas. Tu aurais une solution à me proposer ?

    En tout cas merci à tous pour vos réponses vous m'avez déjà donné de quoi largement améliorer mon code. Merci à tous !

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    @ Sve@r : Et ouvrir le .odt avec open office pour le réenregistrer en .txt ça te parait insurmontable ??
    Ah juste ça. En effet c'est tellement plus simple de demander aux bénévoles de télécharger puis installer OpenOffice sur leur PC juste pour défaire ce que tu n'aurais pas dû faire...

    Citation Envoyé par Toine74 Voir le message
    Je mets le .txt zippé en pièce jointe pour sa majesté.
    Inutile, sa majesté elle te dit bien des choses et va désormais arrêter de perdre son temps avec toi.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Tu aurais une solution à me proposer ?!
    C'est du code basique.
    On part d'une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> L = 3*['A'] + 3*['B'] +4*['C']
    >>> L
    ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C']
    >>>
    dont on essaie d'extraire le (dernier) bout qui commence par 'C'.

    On écrit (par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for i in range(len(L)-1, 0, -1):
    ...     if L[i] != L[-1]:
    ...        break
    ... else:
    ...     print('not found')
    ...
    >>> i
    5
    Et on récupère la sous-liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> L[i+1:]
    ['C', 'C', 'C', 'C']
    >>>
    Bien sûr, si à la place de ABC on a des listes contenant N valeurs, il va falloir ajouter du code pour comparer avec les bons items. Par exemple, si je dois comparer avec le 2ème item, on écrirait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> for i in range(len(L)-1, 0, -1):
    ...     if L[i][1] != L[-1][1]:
    ...        break
    ... else:
    ...     print('not found')
    ...
    >>>
    C'est la même chanson à de petits détails près.
    note: et on se fout pas mal de ce que représentent les données pour s'intéresser à leur organisation "liste" ou "liste de listes".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    50
    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 : 50
    Points : 6
    Points
    6
    Par défaut
    Merci wiztricks je vais essayer ça de suite.

    @Fred1599 j'ai essayé d'enlever les ouvertures multiples et ça me renvoie une erreur. Si je ne mets qu'un seul with open as... au début il exécute bien la première commande (calculer la taille du fichier) mais à la deuxième commande (calculer le dernier jour dans le fichier) j'obtiens une erreur ;
    lines_plot = f_plot.readlines()[-1]
    IndexError: list index out of range
    Apparemment le calcul du nombre le lignes a changé la variable dans laquelle open à mis le fichier. Voilà pourquoi je relis le fichier plusieurs fois.

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 808
    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 808
    Points : 7 086
    Points
    7 086
    Par défaut
    Citation Envoyé par Toine74
    Je ré-ouvre plusieurs fois le fichier car sinon certaines variables donnaient 0 (comme par exemple jour_Courant dans la deuxième ouverture)
    C'est pas parce-que vous faîtes une erreur, qu'il faut en faire d'autres pour croire qu'on a quelque chose de correct.
    De votre côté, croyez-vous logique, sans penser à python qu'il y ai besoin d'ouvrir 3 fois le même fichier pour récupérer l'ensemble de ses lignes ?

    Je pense qu'il y a du bon sens, non ?

    Citation Envoyé par Toine74
    Si je n'ouvre le fichier qu'un seul fois avec un simple open sans le with ça devrait résoudre le problème non ?
    Non ça n'a rien à voir, je vous invite à voir l'intérêt de with open plutôt qu'un simple open en allant voir la multitude de tutoriels sur l'ouverture d'un fichier.

    Citation Envoyé par Toine74
    Quand à la boucle je pense bien qu'il y a un pb dedans mais je n'arrive pas à comprendre où car quand je lance le programme avec les print(Jour_Courant) (ligne (57) et print(Jour) (ligne 59) non mis en commentaire les jours défilent bien mais il ne s'arrête pas quand il arrive au jour demandé.
    Oui vous tombez bien dans ce que je craignais, une boucle infinie... lisez @wiztricks, c'est intéressant car il part de la même vision que vous qui mettez en mémoire l'ensemble des lignes du fichier (liste de lignes).
    Si vous ne comprenez pas, il faut se mettre un peu au travail pour comprendre, car ça fait partie des bases du langage.

    Citation Envoyé par Toine74
    Je ne suis pas programmeur
    Oui on sait, mais ce genre d'excuse ne suffit pas, je suis développeur professionnel et n'est pas fait d'études en informatique, j'ai appris sur le tas ! Et j'ai appris à l'aide de tutoriels... donc ne m'en voulez pas si j'ai un peu de difficultés à comprendre cette remarque... prenez un bouquin, un tutoriel sur le net, faîtes des tests avec votre interpréteur, comme vous a montré @wiztricks dans sa dernière réponse...
    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)

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 107
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 107
    Points : 1 611
    Points
    1 611
    Par défaut
    Il y a une notion de "curseur" quand on ouvre un fichier, et que l'on peut déplacer.
    Quand on fait une lecture, ce curseur bouge en même temps, pour revenir au début du fichier, il faut faire un f.seek(0) https://docs.python.org/3/library/io...io.IOBase.seek

    Ton problème de boucle en 55/56, c'est que tu fais le for en entier avant de retester la condition du while; donc une boucle while dans laquelle tu incrémentes ton i et l'utilises pour parcourir ta liste, ou une boucle for avec un condition de sortie de celle-ci quand le test est OK (utilisation de break).

    PS: passer d'un format de fichier à un autre pourrait apporter des changements plus ou moins mineures comme l'encodage ou des caractères non imprimables en plus ou en moins. Donc si on peut éviter de rajouter des soucis potentiels, c'est mieux pour tout le monde. Et ici, on pouvait se contenter de 2 ou 3 jours de données.

    Après, est-ce que le "truc" qui te génère les fichiers de données, ne peut pas faire un fichier par jour (et pourquoi pas, par salle).

    Et aussi, comme on sait pas de quelle façon tu comptes obtenir tes graph (via python, un tableur, ..?) Il peut y avoir d'autres possibilités pour récupérer les infos que tu veux tracer.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    50
    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 : 50
    Points : 6
    Points
    6
    Par défaut
    Merci à tous pour vos réponses !

    J'ai entièrement repris mon code avec la méthode proposée par wiztriks et en faisant attention au formatage des données avant écriture dans le fichier.

    Maintenant ça donne ça :

    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
    #coding: utf-8
    import glob
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import sys
    import os
    import time
    from datetime import datetime
    from pathlib import Path
    import smbus as smbus
    #import file_read_backwards
    from datetime import date
    mois=('janvier', 'février', 'mars', 'avril','mai', 'juin', 'juillet', 'aout','septembre', 'octobre', 'novembre', 'décembre',
    )	# Pas besoin de liste quand un tuple suffit (et aérer ne fait pas de mal)
    today = date.today()
    current_date = "%s%s" % (mois[today.month - 1],today.strftime("%Y"),)
    print(current_date)
     
    Record_dir = '/home/pi/Domotique/Donnees_Temperature/' + current_date
    Record_file = Record_dir + f"/{current_date}.txt"
    Day_File_Salon = Record_dir + f"/Data_Temp_Day_Salon.txt"
    Day_File_Chambre = Record_dir + f"/Data_Temp_Day_Chambre.txt"
    Day_File_ECS = Record_dir + f"/Data_Temp_Day_ECS.txt"
     
     
    Date = 0
    Heure = 1
    Salon = 2
    Chambre = 3
    ECS = 4
     
    def Selection_Data_Plot(Data_File,Piece,Day_File):
        with open(Data_File, 'r')as f_plot :
            lines_plot = f_plot.readlines()
            i = 0
            for i in range(len(lines_plot)-1, 0, -1):
                if lines_plot[i].split(",")[0].split("-")[0] == lines_plot[-1].split(",")[0].split("-")[0]:
                    i = i+1
                    Debut = i+1
            else:
                 print('Début Dernier jour')
                 print(Debut)
            with open(Day_File, "a", newline="", encoding="utf-8") as f:
                for i in range(Debut,len(lines_plot),1):
                    Date = lines_plot[i].split(",")[0]
                    Heure = lines_plot[i].split(",")[1]
                    Temp_Salon = float(lines_plot[i].split(",")[Piece])
                    data_to_write = {"Jour":Date, "Heure":Heure}
                    root = {"Temperature": Temp_Salon}
                    data_to_write.update(root)
                    writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
                    file_exists = os.path.isfile(Day_File)
                    if not file_exists:
                        writer.writeheader()
                    writer.writerow(data_to_write)
    data_plot_Salon = Selection_Data_Plot(Record_file,Salon,Day_File_Salon)
    et le résultat :

    Data_Temp_Day_Salon.zip


    Merci aussi umfred j'ai compris pourquoi je devais ré-ouvrir le fichier à chaque fois !

    Merci à tous !

  14. #14
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 808
    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 808
    Points : 7 086
    Points
    7 086
    Par défaut
    @Toine74,

    Vous regardez les tutoriels ? Vraiment faîtes le !

    Vous n'avez pas besoin de compteur pour votre variable i, prenez ce temps, où ça sera compliqué pour vous... 1er lien de ma recherche sur la boucle for
    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)

  15. #15
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 099
    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 099
    Points : 4 444
    Points
    4 444
    Par défaut
    bonjour
    Citation Envoyé par Toine74 Voir le message
    Puis il lit la dernière ligne pour savoir quel jour du mois on est (je fait ça car je veux récupérer les dernières 24H de données pour en faire un graph)
    Tu désires uniquement les entrées du jour courant ou bien les entrées des 24 dernières heures ? C'est clairement très différent ! (sauf si tu le lances à minuits )

    Vu le nombre d'entrées dans tes logs, il ne me semble pas judicieux de charger tout le fichier en mémoire !
    Combien de jours dans le fichier log ?

    Pour récupérer les entrées du jour courant (pas les 24 heures!), avec une seule lecture du fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def filtrer_fichier(fichier_nom)
      date_cherchée = "{jour_actuel}-{mois-actuel}-{année_actuelle}"
      avec lecture( fichier_nom ) as fichier:
        pour chaque ligne dans fichier:
          si ligne débute_par date_cherchée alors  # si 24 heures alors on compare 2 datetimes 
              yield ligne
    $moi= ( !== ) ? : ;

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    50
    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 : 50
    Points : 6
    Points
    6
    Par défaut
    Hé bien oui effectivement, dans l'idéal je voudrais un fichier qui contienne les dernières 24h pour en faire un graph via Matplotlib. Il y a une mesure de température toutes les qques secondes et je voudrais que le fichier "24h" se mette à jour automatiquement : au fur et à mesure que le temps passe il rajoute les dernières mesures prises et retire celles qui ont plus de 24h.

    Mais j'ai encore beaucoup de travail avant d'arriver à un graph comme ça...

    Merci papajoker pou ton exemple de code est-il possible de modifier les variable du template pour obtenir les 7 derniers jours ? Les dernières 24h je peux les avoir en modifiant un peu le code que j'ai déjà.

    Merci !

  17. #17
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 099
    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 099
    Points : 4 444
    Points
    4 444
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Merci papajoker pou ton exemple de code est-il possible de modifier les variable du template pour obtenir les 7 derniers jours ? !
    Si tu avais compris le code , tu ne poserais pas cette question !

    Puisque c'est toujours les derniers jours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_cherchée = "{jour_actuel}-{mois-actuel}-{année_actuelle}"
    Il te suffit de décaler de 7 jours la date courante (date_cherchée)

    peux les avoir en modifiant un peu le code que j'ai déjà.
    Comme j'ai expliqué (mais tu n'as pas compris), ce code permet une seule lecture et de ne pas charger en mémoire un fichier monstrueux.

    NOTE:
    Bien sûr, si c'est toi qui génères les logs, alors il faudrait modifier tes logs plutôt que de les subir maintenant.
    $moi= ( !== ) ? : ;

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    50
    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 : 50
    Points : 6
    Points
    6
    Par défaut
    Si papa joker j'ai très bien compris ton code,c'est moi qui ai été imprécis dans ma question : doit-on définir le jour cherché avant la définition du template ou peut-on le faire directement dans le template ?
    Vu ta réponse il faut le faire avant.
    Le fichier source pour un mois va chercher dans les 20-25Mo on est loin du fichier monstrueux... Quand je bossais dans des laboratoires de physique c'était par To que ça arrivait.

  19. #19
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 099
    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 099
    Points : 4 444
    Points
    4 444
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    doit-on définir le jour cherché avant la définition du template ou peut-on le faire directement dans le template ?
    Vu ta réponse il faut le faire avant.
    Désolé, je ne comprends pas ...
    Si on peut éviter de faire un calcul dans une boucle, alors on le fait avant (c'est ce que tu fais ligne 16)
    Vu ta demande jour/semaine, alors il serait plus judicieux de passer cette date en paramètre à la fonction.
    $moi= ( !== ) ? : ;

  20. #20
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 107
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 107
    Points : 1 611
    Points
    1 611
    Par défaut
    @papajoker je pense qu'il a mal interprété la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_cherchée = "{jour_actuel}-{mois-actuel}-{année_actuelle}"

    Ici (sauf erreur), il faut remplacer les {..} par leur valeur réelle (ou alors modifier la ligne pour la formater à partir de valeurs de variable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    date_cherchée = "20-02-2024"
    #ou
    date_cherchée = f"{jour_actuel}-{mois_actuel}-{année_actuelle}" # il faut que les variables entre {} aient été définies avant d'arriver sur cette ligne
    #ou
    date_cherchée = "{}-{}-{}".format(jour_actuel,mois_actuel,année_actuelle) #idem, les variables doivent être définies avant d'arriver sur cette ligne
    ce code c'est par rapport à une durée en jour effectif, pas sur 24h; pour ça, il faudra rajouter l'heure à cette date, et comparer les 2 DateTime complètes

Discussions similaires

  1. selection d'une partie du fichier
    Par elkhansa dans le forum QlikView
    Réponses: 1
    Dernier message: 04/08/2011, 16h40
  2. copier une partie d´un fichier dans un autre
    Par makohsarah dans le forum Langage
    Réponses: 8
    Dernier message: 23/08/2006, 09h53
  3. [VB6]Lire une partie d'un fichier .txt
    Par patoch76 dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 02/05/2006, 20h49
  4. [VB]recherche dans une partie d'un fichier texte
    Par malhivertman1 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/01/2006, 11h56
  5. Select sur une partie d'un champs texte
    Par dl_jarod dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/11/2005, 15h25

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