Forum Programmation.python Ecriture fichier txt

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
24
avr.
2015

Bonjour , j'ai un petit soucis , avec mon code python , je voudrais écrire dans le fichier histINT.txt .

Thu Apr 23 12:50:03 2015 /19.1

Par contre je ne sais pas comment renseigné la ligne en 141 .
sfile.write(get_c_locale_abbrev() + ???,i(??????))

voila mon code

#!  /usr/bin/python
# -*- coding: utf-8 -*-
## ----------------------
## Lecture temperature
## ----------------------

import locale
import datetime
import time
import subprocess
import os
import sys
import shlex
import glob
from re import search





#fonction pour changer le language de la date en anglais

def get_c_locale_abbrev():
  lc = locale.setlocale(locale.LC_TIME)
  try:
    locale.setlocale(locale.LC_TIME, "C")
    return time.strftime("%a %b %d %H:%M:%S %Y")
  finally:
    locale.setlocale(locale.LC_TIME, lc)



#os.system('modprobe w1-gpio')
#os.system('modprobe w1-therm')

## Quelques variables
base_dir = '/sys/bus/w1/devices/'
devices = glob.glob(base_dir + '28-000005239592')

TPS_DEV = 0.5
MAX_READ = 5
ERROR = -99

def read_temp_raw(device_file):
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

## Lecture de la temperature
def read_one_temp(file):
    nb = 0
    while True:
        lines = read_temp_raw(file)
        if lines:
            ## Si le CRC est bon 
            if lines[0].find('YES'):
                nb = 0
                ## La on a tout bon
                ## Normalement ya 2 lignes
                if len(lines) == 2:
                    eq = lines[1].find('t=')
                    temp_string = lines[1][eq+2:]
                    temp_c = float(temp_string) / 1000.0
                    return temp_c
                else:
                    return ERROR
            else:
                ## On incremente et on recommande
                nb += 1
                time.sleep(1)
                if nb > MAX_READ:
                    return ERROR
        else:
            ## Probleme on arrive pas a lire
            ## ON sort avec une valeur 
            return ERROR

## Lecture de 10 valeurs
## on enleve les 2 plus fortes
## on enleve les 2 plus faibles
## on fait la moyenne
def read_temp(file):
    data = []
    ## Lecture de 10 temperature
    for x in range(0,10):
        data.append( read_one_temp(file) )
    ## on tri
    data.sort()
    #print "> ", data
    r = data[2:-2]
    #print "> ", data[2:-2]
    return sum(r)/float(len(r))

## On lit tout les peripheriques
def read_all():
    all_dev = []
    for dev in devices:
        all_dev.append( read_temp(dev + '/w1_slave') )
        time.sleep(TPS_DEV)
    return all_dev

def main(arg):
    DEVICE = 0
    if len(arg) > 1:
        if arg[1] == '2':
            DEVICE = 1

    ## On lit tout
    capteurs = read_all()
    ## Mode Reel
    print capteurs[DEVICE]
    ## Mode test
    #print "%2.2f" % 35

if __name__ == '__main__':
    main(sys.argv)    




''' **********
 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()
histINT = "/webdata/hist-INT"

#Nom des fichier
Temp_histINT= histINT + "{}".format(current_time.minute % 5) + ".txt"
Link_histINT= histINT + ".txt"

#creation du fichier modulus
#try:
if True:
   sfile = open(Temp_histINT,'w')
   sfile.write(get_c_locale_abbrev() + read_all(data))
   sfile.close()
   #creation du link  os.symlink ne marche pas si le fichier est déja linké
   #os.symlink(Temp_histINT,Link_histINT)
   subprocess.Popen(["/bin/ln","-fs",Temp_histINT,Link_histINT])



#except:
#   print("unable to create {}".format(Temp_histINT))
  • # Est-ce que tu as un message d'erreur ?

    Posté par  . Évalué à 1. Dernière modification le 24 avril 2015 à 09:23.

    Sinon, à première vue je dirai que tu essais d'assembler une chaîne avec une liste.
    Peut-être que qqchose comme ça va fonctionner:

    sfile.write(get_c_locale_abbrev() + ' '.join(read_all(data)))

    • [^] # Re: Est-ce que tu as un message d'erreur ?

      Posté par  . Évalué à 1.

      Merci denxp , j'ai testé mais helas j'ai toujours la meme erreur en ligne 84 .

      Traceback (most recent call last):
      File "new05.py", line 84, in
      sfile.write(get_c_locale_abbrev() + ' '.join(read_all(data)))
      NameError: name 'read_all' is not defined

      • [^] # Re: Est-ce que tu as un message d'erreur ?

        Posté par  . Évalué à 1.

        Comme dit ci-dessous la définition de la fonction read_all n'est pas bonne : manque le paramètre.
        Je n'avais pas fait attention.

        • [^] # Re: Est-ce que tu as un message d'erreur ?

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

          Ceci dit, ça n'explique pas un NameError: name 'read_all' is not defined, l'erreur doit porter sur un code différent de celui qui est dans le post original.

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

          • [^] # Re: Est-ce que tu as un message d'erreur ?

            Posté par  . Évalué à 1.

            En effet je me suis tromper l'erreur est :

            File "new05.py", line 141, in
            sfile.write(get_c_locale_abbrev() + ' '.join(read_all(data)))
            NameError: name 'data' is not defined

            • [^] # Re: Est-ce que tu as un message d'erreur ?

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

              T'as plus qu'à réessayer en virant le data de l'appel à read_all() (vu que celui-ci ne prend pas de paramètre…).

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

              • [^] # Re: Est-ce que tu as un message d'erreur ?

                Posté par  . Évalué à 1. Dernière modification le 24 avril 2015 à 17:09.

                Effectivement il y a du mieux , le fichier hist-INT.txt se crées bien mai il est vide .

                File "new05.py", line 141, in
                sfile.write(get_c_locale_abbrev() + ' '.join(read_all()))
                TypeError: sequence item 0: expected string, float found

                Le code du premier post que j'ai posté est un assemblage de plusieurs partie de code que j'ai mélangé pour essayé de comprendre le fonctionnement.

                Mon fichier original fonctionne , mais pas comme je le souhaite . Ce que je veux obtenir dans mon fichier hist-INT.txt est

                Thu Apr 23 12:50:03 2015 /19.1
                et ce que j'ai (Avec mon fichier original )
                Fri Apr 24 17:05:04 2015 /[['TDS1', '28-000005239592', 'T\xb0Interieure', 19.75]]

                • [^] # Re: Est-ce que tu as un message d'erreur ?

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

                  A priori c'est que la valeur retournée par read_all() n'est pas une liste de chaînes. Tu peux essayer ça:

                  sfile.write(get_c_locale_abbrev() + ' '.join([str(x) for x in read_all()]))

                  Mais ça risque de ne pas encore donner la valeur que tu veux (il faut que tu identifies l'index de la valeur qui t'intéresse — l'index 3 si c'est la 4ème valeur flottante) et que tu extraies cette valeur.

                  sfile.write(get_c_locale_abbrev() + str(read_all()[3]))

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

                  • [^] # Re: Est-ce que tu as un message d'erreur ?

                    Posté par  . Évalué à 1.

                    Merci lolop j'ai testé ça

                    sfile.write(get_c_locale_abbrev() + ' '.join([str(x) for x in read_all()]))

                    Mon fichier texte se créé et se rempli de cette façon .

                    Fri Apr 24 19:18:22 201519.8853333333

                    Cette ligne de commande m'indique toujours une erreur .
                    sfile.write(get_c_locale_abbrev() + str(read_all()[3]))

                    • [^] # Re: Est-ce que tu as un message d'erreur ?

                      Posté par  . Évalué à 2.

                      Merci lolop j'ai testé ça
                      sfile.write(get_c_locale_abbrev() + ' '.join([str(x) for x in read_all()]))

                      Mon fichier texte se créé et se rempli de cette façon .
                      Fri Apr 24 19:18:22 201519.8853333333

                      ben c'est pas mal non ?
                      tu as la date, et la temperature 19.8853333333

                      il te manque juste un espace entre les deux, et c'est normalement le but du +'--ici l'espace--'.join(...)

                      • [^] # Re: Est-ce que tu as un message d'erreur ?

                        Posté par  . Évalué à 1. Dernière modification le 25 avril 2015 à 08:44.

                        Bonjour Neox , ce n'est pas le probleme de l'espace entre l'année et la valeur de température qui m'interpelle mais cette valeur 19.8853333333, ce que je veux obtenir dans mon fichier est 19.8

                        • [^] # Re: Est-ce que tu as un message d'erreur ?

                          Posté par  . Évalué à 2.

                          si read_all te renvoie 19.88533333
                          et que tu veux 19.9 il faut jouer avec les arrondis

                          il doit y avoir une fonction qui fait ca, admettons qu'elle s'appelle round() et prenne 2 arguments, la valeur, et le nombre de decimale

                          ca donnerait un truc du genre :
                          round(read_all(),1)

                          à mettre à la place du read_all() actuel dans le sfile.write(…)

                          evidemment j'ai dit round(), mais je ne suis pas aller voir dans le manuel de python ni sur internet pour savoir si c'etait son vrai nom.

                          • [^] # Re: Est-ce que tu as un message d'erreur ?

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

                            Ça peut se faire facilement avec du formatage, un test avec le shell Python:

                            >>> "{} {:.1f}".format("Fri Apr 24 19:18:22 2015", 19.8853333333)
                            'Fri Apr 24 19:18:22 2015 19.9'

                            Ce qui donnerais, à condition qu'il n'y ait qu'une seule valeur dans la liste retournée par read_all():

                            s = "{} {:.1f}".format(get_c_locale_abbrev(),  read_all()[0])
                            sfile.write(s)

                            S'il y a plusieurs valeurs retournées par read_all(), un formatage dans une liste en compréhension avec un join() (remplacer l'espace du join() par tout autre séparateur désiré, un test avec le shell Python:

                            >>> lst = [2.3428, -3.432,9.16743]
                            >>> " ".join(["{:.1f}".format(x) for x in lst])
                            '2.3 -3.4 9.2'

                            Ce qui donnerais avec tes fonctions:

                            s = "{} {}".format(get_c_locale_abbrev(),  " ".join(["{:.1f}".format(x) for x in read_all()]))
                            sfile.write(s)

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

                            • [^] # Re: Est-ce que tu as un message d'erreur ?

                              Posté par  . Évalué à 1.

                              Merci a tous Super ça fonctionne .
                              J'ai bricolé ce code que j'ai posté , pour essayé de comprendre le fonctionnement de la création et de l’écriture du fichier histINT.

                              je pensais pouvoir me débrouiller seul pour adapter ça a mon fichier howonpi .Mais ce n'est pas du tout le cas .

                              Pour écrire dans histINT j'ai fais ca .

                              sfile.write(get_c_locale_abbrev() + " /" +  validatePrint(sensorInfo))

                              sensorInfo n'est pas bon , je récupère trop d'information .

                              Sat Apr 25 13:10:04 2015 /[['TDS1', '28-000005239592', 'T\xb0Interieure', 19.0]]

                              #!/usr/bin/env python
                              # -*- coding: utf-8 -*-
                              
                              """
                                 Scan all sensors from DS18B20.conf
                                 store data into rrdtool database
                                 export chart data 
                              
                              """
                              import locale
                              import datetime
                              import time
                              import subprocess
                              import os
                              import sys
                              import shlex
                              import DS18B20
                              from re import search
                              
                              
                              DS = DS18B20.DS18B20()
                              
                              #fonction pour changer le language de la date en anglais
                              
                              def get_c_locale_abbrev():
                                lc = locale.setlocale(locale.LC_TIME)
                                try:
                                  locale.setlocale(locale.LC_TIME, "C")
                                  return time.strftime("%a %b %d %H:%M:%S %Y")
                                finally:
                                  locale.setlocale(locale.LC_TIME, lc)
                              
                              
                              #first read  configuration  to get DS18B20 ID and label info
                              
                              try:
                                fileH = open("/home/www/Graph/DS18B20.conf")
                                text = fileH.read()
                                fileH.close()
                                sensorInfo= [ s.strip().split(',') for s in text.splitlines()]
                              except:
                                print("Unable to read 'DS18B20.conf'")
                                quit()
                              
                              
                              NumberOfSensor= len(sensorInfo)
                              
                              if NumberOfSensor ==0:
                                print("No sensor in configuration file 'DS18B20.conf'. Exit!")
                                quit()
                              
                              
                              #get Temperature of each sensor
                              #add add it up into the sensor Info
                              
                              for i in sensorInfo:
                               i.append(DS.read(i[1]))
                              
                              
                              #let's update the current status file
                              
                              #if the value is None  just put ---
                              def validatePrint(value):
                                if value == None:
                                   return "---"
                                else:
                                   return "{}".format(value)
                              
                              #if the value is None tell rrdtool that the value is unknown
                              def validateRRD(value):
                                if value == None:
                                   return ":U"
                                else:
                                   return ":{}".format(value)
                              
                              ''' **********
                               Ici c'est le fichier hist-INT
                               ce fichier est créé avec un modulus % 5 de la minute.
                               Donc 5 fichier en alternance et le dernier sera un link sur hist-INT
                               pour permettre d'utiliser hist-INT sans avoir de problème
                               de lecture lorsque le fichier ce fait écrire '''
                              
                              #current time
                              current_time= datetime.datetime.now()
                              histINT = "/home/www/logs/hist-INT"
                              
                              #Nom des fichier
                              Temp_histINT= histINT + "{}".format(current_time.minute % 5) + ".txt"
                              Link_histINT= histINT + ".txt"
                              
                              #creation du fichier modulus
                              #try:
                              if True:
                                 sfile = open(Temp_histINT,'w')
                                 sfile.write(get_c_locale_abbrev() +  " /"  + validatePrint(sensorInfo))
                                 sfile.close()
                                 #creation du link  os.symlink ne marche pas si le fichier est déja linké
                                 #os.symlink(Temp_histINT,Link_histINT)
                                 subprocess.Popen(["/bin/ln","-fs",Temp_histINT,Link_histINT])
                              
                              
                              
                              #except:
                              #   print("unable to create {}".format(Temp_histINT))     
                              
                              
                              
                              
                              
                              webdata = "/home/www/Graph/webdata/"
                              currentStatus = webdata + "DS18B20Status.txt"
                              
                              try:
                              
                                sfile = open(currentStatus,'w')
                                for sensor in sensorInfo:
                                  sfile.write(sensor[0])
                                  sfile.write("," + sensor[1])
                                  sfile.write("," + sensor[2])
                                  sfile.write("," + validatePrint(sensor[3])+ "\n")
                                sfile.close()
                              except:
                                print("unable to create '/home/www/Graph/webdata/DS18B20Status.txt'")
                              
                              
                              #now let's insert the result into rrdtool database
                              
                              fileRrdTool = "/home/www/Graph/data_DS18B20.rrd"
                              
                              #let's fill the command line with the 
                              
                              #Current time (Right now)
                              rdata = "N"
                              
                              #add the sensors result
                              for sensor in sensorInfo:
                                rdata = rdata + validateRRD(sensor[3])
                              
                              #now update the database
                              
                              subprocess.Popen(["/usr/bin/rrdtool","update",fileRrdTool,rdata])
                              
                              
                              
                              #data Extraction to create data point for the charts.
                              
                              #create a function with start and step parameters
                              #this way we could create chart with different timing
                              
                              
                              
                              def rrdExport(start, step, XMLfile):
                                texte = "rrdtool xport -s {0} -e now --step {1} ".format(start, step)
                                #let's populate for each sensor
                                for i in  range(NumberOfSensor):
                                  texte += "DEF:{}={}:{}:AVERAGE ".format(chr(ord('a')+i),fileRrdTool,sensorInfo[i][0])
                                  texte += "XPORT:{}:""{}"" ".format(chr(ord('a')+i),sensorInfo[i][2])
                                fileout = open(webdata+XMLfile,"w")
                                args = shlex.split(texte)
                                subprocess.Popen(args,stdout=fileout)
                                fileout.close()
                              
                              
                              # ok extact 3 hours data
                              rrdExport("now-3h",300, "temperature3h.xml")
                              
                              #ok 24 hours
                              rrdExport("now-24h",900, "temperature24h.xml")
                              
                              #ok 48 hours
                              rrdExport("now-48h",1800, "temperature48h.xml")
                              
                              #ok 1 week
                              rrdExport("now-8d",3600, "temperature1w.xml")
                              
                              #ok 1 month
                              rrdExport("now-1month",14400, "temperature1m.xml")
                              
                              #ok 3 month
                              rrdExport("now-3month",28800, "temperature3m.xml")
                              
                              #ok 1 year
                              rrdExport("now-1y",43200, "temperature1y.xml")
                              
                              #ok just print on the screen what we have
                              
                              for sensor in sensorInfo:
                                print("{}:{}".format(sensor[2],validatePrint(sensor[3])))
                              
                              #done
                              • [^] # Re: Est-ce que tu as un message d'erreur ?

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

                                #Nom des fichier
                                Temp_histINT= histINT + "{}".format(current_time.minute % 5) + ".txt"
                                Link_histINT= histINT + ".txt"

                                Et hop, utilisation du formatage de chaînes jusqu'au bout, plutôt que de concaténer :

                                #Nom des fichier
                                Temp_histINT= "{}{}.txt".format(histINT, current_time.minute % 5)
                                Link_histINT= "{}.txt".format(histINT)

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

                              • [^] # Re: Est-ce que tu as un message d'erreur ?

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

                                sfile.write(get_c_locale_abbrev() + " /" + validatePrint(sensorInfo))

                                sensorInfo n'est pas bon , je récupère trop d'information .

                                Sat Apr 25 13:10:04 2015 /[['TDS1', '28-000005239592', 'T\xb0Interieure', 19.0]]

                                Ta fonction validatePrint() transforme la liste sensorInfo en texte, et on peut voir que cette liste comportait 4 éléments. C'est plutôt galère de travailler à partir du texte, il vaut mieux faire à partir de la liste, soit directement, soit dans validatePrint().

                                Directement:

                                sfile.write(get_c_locale_abbrev() + " /" +  "{:.1f}".format(sensorInfo[3]))

                                Dans validatePrint():

                                #if the value is None  just put ---
                                def validatePrint(value):
                                  if value == None:
                                     return "---"
                                  elif isintance(value, list):
                                     # Index -1 pour prendre le dernier élément qui doit être un nombre…
                                     return "{:.1f}".format(value[-1])
                                  else:
                                     return str(value)

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

  • # Bugs

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

    Pour commencer, déjà avec la définition:

    def read_all():
        

    et plus loin l'appel:

    sfile.write(get_c_locale_abbrev() + read_all(data))

    Il va falloir se mettre d'accord si read_all() prend ou non un paramètre.

    Ensuite, comme indiqué par denxp, tu as un read_all() qui retourne une liste, get_c_locale_abbrev() qui retourne une chaîne et tu concatènes donc une liste à une chaîne, ça n'est pas autorisé. Donc il faut utiliser la solution proposée par denxp ou toute autre solution qui te permette d'obtenir une chaîne de caractères à utiliser dans l'appel à sfile.write().

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

Suivre le flux des commentaires

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