Forum Programmation.python Fichier hist-EXT

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
13
juin
2015

Slt , je reviens vers vous pour un petit soucis sur ma sonde DHT 22
voila un bout de code qui me sert a créer un fichier hist-EXT , De temps en temps ce fichier hist-EXT est vide .( certainement un plantage lors de l'interrogation de la sonde ) Est'il possible de trouver une solution pour que ce fichier ne sois pas vide (garder la dernière valeur lue) mais quoi ajouter dans le if True?

Merci d'avance.

    Ici c'est le fichier hist-EXT
     ce fichier est créé avec un modulus % 5 de la minute.
     Donc 5 fichier en alternance et le dernier sera un link sur hist-EXT
     pour permettre d'utiliser hist-EXT sans avoir de problème
     de lecture lorsque le fichier ce fait écrire '''

    #current time
    current_time= datetime.datetime.now()
    histEXT = "/home/www/logs/hist-EXT"

    #Nom des fichier
    Temp_histEXT= histEXT + "{}".format(current_time.minute % 5) + ".txt"
    Link_histEXT= histEXT + ".txt"

    #creation du fichier modulus
    #try:
    if True:
       sfile = open(Temp_histEXT,'w')
       sfile.write(get_c_locale_abbrev() + " /" +  validatePrint(temperature) + "/" + validatePrint(humidity) + "/1\n")
       sfile.close()
       #creation du link  os.symlink ne marche pas si le fichier est déja linké
       #os.symlink(Temp_histEXT,Link_histEXT)
       subprocess.Popen(["/bin/ln","-fs",Temp_histEXT,Link_histEXT])



    #except:
    #   print("unable to create {}".format(Temp_histEXT))
  • # append

    Posté par  (site web personnel) . Évalué à 2.

    Au lieu de "w", tu devrais essayer "a+".

    S'il y a un risque que la sonde traceback, tu devrais déjà récupérer la valeur de la sonde, puis l'écrire dans le fichier si ok.

    Cela ressemblera à :

    val = get_c_locale_abbrev() + " /" + validatePrint(temperature) + "/" + validatePrint(humidity) + "/1\n"
    sfile = open(Temp_histEXT,'a+')
    sfile.write(val)
    sfile.close()

    • [^] # Re: append

      Posté par  . Évalué à 1.

      Merci GnunuX mais le résultat attendu n'est pas la !! (ce que j'ai oublier de dire),les valeurs de ce fichier Temp_histEXT sont récupéré par un autre script donc ça ne colle pas

      Voila ce que j'ai maintenant dans Temp_histEXT
      Sun Jun 14 09:15:04 2015 /16.9/69.6/1
      Sun Jun 14 09:20:07 2015 /---/---/1
      Sun Jun 14 09:25:06 2015 /---/---/1
      Sun Jun 14 09:30:06 2015 /---/---/1

  • # Vérifier les données avant d'écrire le fichier

    Posté par  (site web personnel) . Évalué à 2.

    Si ça plante alors que le fichier est ouvert (hormis un pb d'écriture sur le disque), c'est qu'un appel à get_c_locale_abbrev() ou validatePrint() a échoué. Le mieux est de les réaliser avant d'ouvrir le fichier:

    if True:
        cla = get_c_locale_abbrev()
        s1 = validatePrint(temperature)
        s2 = validatePrint(humidity)
        # Si on arrive là, cla, s1 et s2 sont normalement ok, au pire on peut
        # mettre un test sur leurs valeurs et n'enregistrer que si ce test
        # est positif.
        sfile = open(Temp_histEXT,'w')
        sfile.write(cla + " /" +  s1 + "/" + s2 + "/1\n")
        sfile.close()
        subprocess.Popen(["/bin/ln","-fs",Temp_histEXT,Link_histEXT])

    Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

    • [^] # Re: Vérifier les données avant d'écrire le fichier

      Posté par  (site web personnel) . Évalué à 2.

      Éventuellement… contrôler que cla, s1 et s2 sont des chaînes (si get_c_locale() ou validatePrint() peuvent retourner autre chose).

          if isinstance(cla,str) and isinstance(s1,str) and isinstance(s2,str):
              sfile = open()
              sfile.write()
              sfile.close()
              subprocess.Popen()

      Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

      • [^] # Re: Vérifier les données avant d'écrire le fichier

        Posté par  . Évalué à 1.

        Je me suis mal exprimé , de temps en temps l’interrogation de ma sonde DHT22 échoue et je me retrouve avec comme écriture dans hist-EXT cela

        Sun Jun 14 09:20:07 2015 /---/---/1 (aucune valeur)

        ce fichier est créé avec un modulus % 5 de la minute.
        Donc 5 fichier en alternance et le dernier sera un link sur hist-EXT
        hist-EXT0.txt
        hist-EXT1.txt
        hist-EXT2.txt
        hist-EXT3.txt
        hist-EXT4.txt

        je voudrais que si la lecture échoue hist-EXT se remplisse avec un des 5 fichiers qui a les valeurs .

        Sun Jun 14 09:15:04 2015 /16.9/69.6/1

        • [^] # Re: Vérifier les données avant d'écrire le fichier

          Posté par  (site web personnel) . Évalué à 2. Dernière modification le 15 juin 2015 à 23:01.

          Dans ce cas, commences par relire le dernier fichier que tu as créé (qui est normalement accessible via le lien symbolique /home/www/logs/hist-EXT.txt avant que tu ne le changes), extrais les valeurs (un split sur '/' devrait le faire, puis récup des valeurs aux index 1 et 2), et en cas d'erreur tu recombines les anciennes valeurs valides avec la date courante.

          Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

          • [^] # Re: Vérifier les données avant d'écrire le fichier

            Posté par  (site web personnel) . Évalué à 2.

            Du genre:

             #current time
                current_time= datetime.datetime.now()
                histEXT = "/home/www/logs/hist-EXT"
            
                #Nom des fichier
                Temp_histEXT= histEXT + "{}".format(current_time.minute % 5) + ".txt"
                Link_histEXT= histEXT + ".txt"
            
                #creation du fichier modulus
                #try:
                if True:
                   cla = get_c_locale_abbrev()
                   s1 = validatePrint(temperature)
                   s2 = validatePrint(humidity) 
                   if s1 = '---' or s2 == '---':  # A adapter…
                     old = open(Link_histEXT).read().split('/') # Pas propre, mais rapide.
                     s1 = old[1]
                     s2 = old[2]
                   sfile = open(Temp_histEXT,'w')
                   sfile.write(cla + " /" +  s1 + "/" + s2 + "/1\n")
                   sfile.close()
                   subprocess.Popen(["/bin/ln","-fs",Temp_histEXT,Link_histEXT])

            Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

            • [^] # Re: Vérifier les données avant d'écrire le fichier

              Posté par  . Évalué à 1.

              Bonsoir et merci lolop pour ton aide , j'ai oublier encore d'expliquer quelques chose !! Ma sonde capte a la fois la température et l'humidité . C'est du tout ou rien si la lecture échoue pour la température elle échoue aussi pour l'humidité (Absence automatiquement des 2 valeurs).
              C'est pour cela que je ne comprend pas quoi et comment adapter ici ??

              if s1 = '---' or s2 == '---': # A adapter…

              • [^] # Re: Vérifier les données avant d'écrire le fichier

                Posté par  (site web personnel) . Évalué à 2.

                C'est justement pour ce que tu indiques - ne sachant pas s'il pouvait y avoir une des deux valeurs valides… c'était à adapter. Mais vu ce que tu écrits, tu peux laisser le code tel quel (le or sera juste superflux) ou bien te contenter de tester si s1 est à '---'.

                Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

                • [^] # Re: Vérifier les données avant d'écrire le fichier

                  Posté par  . Évalué à 1.

                  Aille çà bloque la.

                  File "readDHT22T.py", line 90
                  if s1 = '---' or s2 == '---':
                  ^
                  SyntaxError: invalid syntax

                  #creation du fichier modulus
                  #try:
                  if True:
                         cla = get_c_locale_abbrev()
                         s1 = validatePrint(temperature)
                         s2 = validatePrint(humidity) 
                         if s1 = '---' or s2 == '---':
                           old = open(Link_histEXT).read().split('/')
                  # Pas propre, mais rapide.
                           s1 = old[1]
                           s2 = old[2]
                         sfile = open(Temp_histEXT,'w')
                         sfile.write(cla + " /" +  s1 + "/" + s2 + "/1\n")
                         sfile.close()
                         subprocess.Popen(["/bin/ln","-fs",Temp_histEXT,Link_histEXT])
                     #creation du link  os.symlink ne marche pas si le fichier est déja linké
                     #os.symlink(Temp_histEXT,Link_histEXT)
                     subprocess.Popen(["/bin/ln","-fs",Temp_histEXT,Link_histEXT])
                  
                  
                  
                  #except:
                  #   print("unable to create {}".format(Temp_histEXT))

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.