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 denxp . É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 b.gwen . É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 denxp . É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 lolop (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.Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Est-ce que tu as un message d'erreur ?
Posté par b.gwen . É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 lolop (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…).Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Est-ce que tu as un message d'erreur ?
Posté par b.gwen . É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 lolop (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:
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.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Est-ce que tu as un message d'erreur ?
Posté par b.gwen . É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 NeoX . Évalué à 2.
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 b.gwen . É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 NeoX . É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 lolop (site web personnel) . Évalué à 4.
Ça peut se faire facilement avec du formatage, un test avec le shell Python:
Ce qui donnerais, à condition qu'il n'y ait qu'une seule valeur dans la liste retournée par read_all():
S'il y a plusieurs valeurs retournées par
read_all()
, un formatage dans une liste en compréhension avec unjoin()
(remplacer l'espace dujoin()
par tout autre séparateur désiré, un test avec le shell Python:Ce qui donnerais avec tes fonctions:
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Est-ce que tu as un message d'erreur ?
Posté par b.gwen . É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 .
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]]
[^] # Re: Est-ce que tu as un message d'erreur ?
Posté par lolop (site web personnel) . Évalué à 2.
Et hop, utilisation du formatage de chaînes jusqu'au bout, plutôt que de concaténer :
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Est-ce que tu as un message d'erreur ?
Posté par lolop (site web personnel) . Évalué à 3.
Ta fonction
validatePrint()
transforme la listesensorInfo
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 dansvalidatePrint()
.Directement:
Dans validatePrint():
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
# Bugs
Posté par lolop (site web personnel) . Évalué à 4.
Pour commencer, déjà avec la définition:
et plus loin l'appel:
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()
.Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.