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 :

Calcul dans fichier txt


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut Calcul dans fichier txt
    Bonjour,

    J'ai un code dans lequel je souhaite lire le nombre dans un fichier texte, le multiplier et enregistrer la somme dans ce dernier.
    Voici le code :
    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
     
    import threading
    import os
    import sys
     
    a = 10
     
    # Lecture du fichier et tranforme le nombre en float
    def fichier_1000():
        fichier = open('.../1000.txt', "r")
        texte = fichier.read()
        valeur = float(texte)
        return valeur
     
    # Multiplication
    def incrementation_fichier_1000():
        multiplication = fichier_1000() * 1.2
        arrondi = round(multiplication, 6)
        return arrondi
     
    # Tranformation du calcul en Str
    f_1000 = str(incrementation_fichier_1000())
     
    #Enregistrement du résultat dans le fichier
    def inscription_new_valeur_1000():
        f = open('.../1000.txt', "w")
        f.write(f_1000)
        f.close()
     
    # Le calcul se fait toutes les x secondes, ici 5
    def reloadapi():
        threading.Timer(5.0, reloadapi).start()
        if float(a) > 5:
            inscription_new_valeur_1000()
    reloadapi()
    Quand je lance le code, le calcul se fait correctement ainsi que l'enregistrement la première fois, le problème est à chaque refresh. Le calcul ne se fait plus mais l'enregistrement est lui ok. En dehors du Threading cela fonctionne mais pas dans celui-ci.
    Savez vous d'ou peut venir le problème, auriez une astuce s'il vous plait?

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par berty4242 Voir le message
    Savez vous d'ou peut venir le problème, auriez une astuce s'il vous plait?
    Le problème vient de la ligne 22.

    Lorsque vous demandez à Python d'exécuter des instructions, il le fait (ou il plante) même si vous ne comprenez pas trop ce que vous lui avez demandé de faire.

    L'astuce est d'apprendre à relire ses instructions en se mettant à la place de Python pour comprendre ce qu'il va bien pouvoir en faire et de vérifier (avec des "print") que çà fait ce qu'on pense.

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

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut
    Merci Wiztricks pour votre retour.

    J'ai suivi votre conseil et je ne trouve malheureusement pas l'erreur.
    Si j’exécute le script sans threading.Timer je n'ai aucun problème, a chaque exécution l'incrémentation du calcul ainsi que la sauvegarde fonctionne correctement. par contre quand je lance le script que j'ai indiqué plus haut le calcul se fait uniquement la première fois mais la sauvegarde est ok toutes les 5 secondes.
    J'ai testé également de ne pas indiquer le format "str" mais une erreur indique qu'il faut me le faut...

    Cdlt

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par berty4242 Voir le message
    J'ai suivi votre conseil et je ne trouve malheureusement pas l'erreur.
    T'as remarqué que dans le thread tu ne fais que récrire encore et toujours la même valeur ??? Si tu veux qu'elle augmente dans le thread, à mon avis il te faudrait la réactualiser aussi dans le thread.
    Accessoirement fermer le fichier une fois qu'il a été lu serait aussi un atout pour la réussite. Et puis toutes ces variables globales c'est pas non plus la super idée.

    Citation Envoyé par berty4242 Voir le message
    J'ai testé également de ne pas indiquer le format "str" mais une erreur indique qu'il faut me le faut...
    Oui il le faut au write donc on peut ne le mettre qu'au moment du write (ie f_1000=incrementation_fichier_1000(); f.write(str(f_1000))). Ca a l'avantage de conserver la data originelle intacte au cas où il faudrait l'utiliser ailleurs.

    PS: c'est quoi ce chemin commençant par "..." ??? Et pourquoi, si a vaut 10 (entier) le convertir en float pour le comparer avec 5 (autre entier) ???
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par berty4242 Voir le message
    J'ai suivi votre conseil et je ne trouve malheureusement pas l'erreur.
    Ben vous devriez utiliser la commande magique "print" pour afficher ce qui est écrit dans le fichier à chaque fois que reloadapi est exécuté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def inscription_new_valeur_1000():
        f = open('.../1000.txt', "w")
        print(f_1000)
        f.write(f_1000)
        f.close()
    Vous devriez constater que la valeur n'est modifiée qu'une seule fois.
    Et donc que f_1000 n'est pas mis à jour.

    Vous pourriez aussi supprimer le thread et écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #def reloadapi():
    #   threading.Timer(5.0, reloadapi).start()
    #   if float(a) > 5:
    #        inscription_new_valeur_1000()
    #reloadapi()
    inscription_new_valeur_1000()
    inscription_new_valeur_1000()
    pour constater que thread ou pas, le problème est encore là.

    Et on retombe toujours sur la ligne 22... sans trop comprendre son utilité.

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

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut
    Salut Sve@r,

    J'ai rajouté la notion de fermer le fichier mais cela écrit toujours la même valeur. Une piste pour réactualiser la valeur dans le thread?
    Je n'ai pas indiqué le nom du chemin volontairement et effectivement ce sont bien des nombres à virgules (je faisais des tests quand j'ai copié les fonctions). Le a = 10 c'est juste pour déclencher le Thread.

    wiztricks

    J'ai donc supprimé le Thread comme vous l'avez indiqué et cela fonctionne parfaitement, le fichier est incrémenté avec le calcul et est enregistré.
    La ligne 22 c'est pour mettre le format Str lors de l'enregistrement sinon j'ai un message d'erreur avec ceci "f.write(str(incrementation_fichier_1000()))".

    Pour info je suis vraiment novice...

    Merci à vous

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par berty4242 Voir le message
    J'ai donc supprimé le Thread comme vous l'avez indiqué et cela fonctionne parfaitement, le fichier est incrémenté avec le calcul et est enregistré.
    Si vous remplacez le thread par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inscription_new_valeur_1000()
    inscription_new_valeur_1000()
    le "print" va vous afficher 2 fois la même valeur.

    Citation Envoyé par berty4242 Voir le message
    Pour info je suis vraiment novice...
    Dans les tutos. vous trouverez explications et exercices corrigés histoire d'être moins "novice" avant de venir ici.

    Un forum de discussion, c'est d'abord pour échanger des idées par pour corriger votre code, et pour pouvoir échanger des idées, partager un minimum de vocabulaire technique est indispensable.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/09/2006, 16h27
  2. lire données dans fichier txt
    Par flo456 dans le forum Langage
    Réponses: 5
    Dernier message: 14/09/2006, 08h01
  3. prb retour a la ligne dans fichier txt telecharge avec php
    Par supersonicblonde dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 14h20
  4. Réponses: 1
    Dernier message: 05/05/2006, 10h36
  5. Donnee excel pour requete sql dans fichier txt ou doc
    Par Yogi_01 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/04/2006, 10h04

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