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 :

Récupération de valeur d'un fichier en python


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2016
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Récupération de valeur d'un fichier en python
    Bonjour,

    Je développe un script en python et je débute un peu. Pour passer à l'étape suivante de mon script j'aurai besoin d'ouvrir un fichier et d'y écrire le contenu de chaque lignes.
    Par exemple j'ai un fichier.txt:
    - ouvre moi fichier.txt
    - récupère la ligne 1 et écris la dans l'interpréteur de commandes
    - récupère la ligne 2 et écris la dans l'interpréteur de commandes
    ....

    J'avais récupéré ceci sur internet
    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
    dicoval={} ## dictionnaire dans lequel on introduit les paires variables/valeurs 
    path = open('fichier.txt','rb') ## Ouverture du fichier de configuration en mode lecture 
    lignes = path.readlines() ## Récupération du contenu du fichier 
    ## Traitement ligne par ligne 
    for lig in lignes:  
        sp = lig.split('[')[0] ## Élimination des commentaires potentiels  
        sp = lig.split(']')[0] ## Élimination des commentaires potentiels  
        sp = sp.split('=') ## Séparation variable / valeur 
    ## on teste la longueur de sp;  si elle n'est pas égale à 2, c'est qu'il s'agit d'une ligne vide ou qu'avec des commentaires     
        if len(sp)==2: dicoval[sp[0].strip()]=sp[1].strip()  
     
    for i in dicoval: 
        exec(i + '=' + str(dicoval[i]))  
     
    path.close() ## Fermeture du fichier de configuration
    Je me demande si j'ai bien compris tout le code... Pour moi il récupère bien les valeurs, du coup je m'étais dis que pour tester il fallait l'afficher manuellement avec un print dicoval ou print dicoval['0'] pour la première valeur mais du coup l'interpréteur me retourne " {} " pour print dicoval et une erreur pour print dicoval[0].
    Si quelqu'un peut m'aider ... Merci d'avance

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut,

    Plutôt que de récupérer un script quelconque, qui d'après ce que j'en comprend lit un fichier de configuration, consulte ceci :
    https://python.developpez.com/cours/...e=page_11#L9.5
    Le temps ronge l'amour comme l'acide.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    En dehors de la réponse de bistouille (qui t'indique effectivement qu'il existe des solutions déjà toutes faites pour traiter certains types de fichiers), voici des remarques plus générales concernant certaines de tes instructions

    Tout d'abord tu ouvres ton fichier en mode "rb" alors qu'il s'agit manifestement d'un fichier texte. Or le mode "b" (binary) est réservé aux fichiers binaires (images, photos, vidéos, sons, etc.). Ce type d'ouverture demande principalement de traiter le fichier sans lui faire subir aucune transformation ; par opposition aux fichiers dits "textes" pour lesquels la représentation d'une fin de ligne (représentation qui diffère selon les OS) devient systématiquement un '\n' quand on lit une ligne.
    Alors sur un système Unix et apparentés (Linux, Centos, etc) cela n'a aucune importance (une fin de ligne étant déjà représentée par un '\n') mais sur un système zindow (qui sur ce domaine aussi a fait autant preuve de stupidité que d'inefficacité) cela peut produire un comportement inattendu (en mode "rb" tu n'as plus de "fin de ligne" comme Python les attend).

    Ensuite tu fais un path.readlines() pour récupérer toutes les lignes d'un coup afin de les traiter une à une. Pourquoi alors toutes les charger ???
    Une des grandes forces de Python c'est de proposer des itérateurs sur tout ce qui peut s'itérer. Or un fichier constitué de plein de lignes semble un candidat parfait à l'itération.
    Donc autant écrire
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    path=open(...)
    for lig in path:
        ...
    # for
    path.close()

    Enfin concernant ta question sur l'accès à l'élément [0] d'un dico, ben tu ne peux accéder à dicoval[0] que si dicoval[0] a été créé. Ben oui, un dictionnaire ce n'est plus un tableau. Les éléments ne sont plus indicés par des chiffres à suivre mais par des clefs à définir. De plus il faut se méfier parce que dicoval[0] ce n'est pas la même chose que dicoval["0"]. Or quand tu lis un fichier texte, tu récupères du texte et non de l'entier. Ainsi, dans dicoval[sp[0].strip()]=... je m'interrogerais sur la nature intrinsèque de sp[0].strip()...
    Ceci dit, même si l'instruction for i in dicoval est possible, personnellement je préfère écrire explicitement for k in dicoval.viewkeys() quand je veux récupérer (itérer) les clefs, for v in dicoval.viewvalues() quand je veux récupérer (itérer) les valeurs et for (k, v) in dicoval.viewitems() quand je veux récupérer (itérer) les couples clefs+valeur. (attention, les méthodes viewxxx() n'existent plus en Python3 et sont remplacées par (je crois) xxx() =>dicoval.viewitems() devient dicoval.items()).
    Par ailleurs tu as des outils intéressants dans les dicos comme par exemple dicoval.get(k, xxx) qui te renvoie la valeur de dicoval[k] si celle-ci existe sinon te renvoie la valeur "xxx". Et c'est la même chose avec dicoval.pop(k, xxx) mais à la différence que si la valeur dicoval[k] existe, elle est renvoyée mais aussi supprimée du dico.

    Autre chose: tu as des outils sympas pour formater du texte. Mon préféré étant le "%" (mais c'est là un avis personnel car il existe aussi format() qui est très puissant et qui est très plébiscité par la communauté).
    Mais bon, moi j'aime bien mon petit "%" ainsi i + '=' + str(dicoval[i]) je l'écris moi "%d=%s" % (i, dicoval[i]). Bon c'est vrai qu'ici la différence est minime mais quand tu auras des formatages plus complexes ça pourra t'être utile. Surtout si (par exemple) tu dois afficher un même élément plusieurs fois sans avoir envie de le recalculer à chaque fois.
    Exemple: print("résultat: %s %s" % (fonction_tres_tres_longue(), fonction_tres_tres_longue())). Le programmeur inexpérimenté aura réflexe (enfin j'espère) de mémoriser le résultat de fonction_tres_tres_longue() avant de l'afficher 2 fois ; le programmeur Python écrira lui print("resultat: %(x)s %(x)s" % { "x" : fonction_tres_tres_longue() }) (et il en va de même avec format() mais sous une autre syntaxe).

    Et sinon (mais ceci n'a rien à voir avec Python mais plus simplement avec la logique de base), quand je vois écrit
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sp=truc
    sp=chose
    ben je me dis qu'il y a quelque part un cable de débranché dans la tête de celui qui a écrit cela sans se rendre compte que la ligne 2 annule l'effet de la ligne 1...
    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]

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Quelle réponse détaillée

    Comme je suis curieux (ça me perdra un jour) j'ai fait une recherche sur ce script, et paf, pif, pouf.

    https://python.developpez.com/faq/?p...le-egal-valeur

    La y'a pas de problème avec le split
    Le temps ronge l'amour comme l'acide.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bistouille Voir le message
    et paf, pif, pouf.
    Ca me rappelle une blague: la mère de toto à 3 enfants: "pif", "paf" et ... (en général tout le monde répond "pouf" alors que c'est "toto" ).

    Citation Envoyé par bistouille Voir le message
    La y'a pas de problème avec le split
    Ouais j'ai dis ça au hasard sans vérifier. Mais une chose est certaine: si la demande de dicoval[0] renvoie une exception (KeyError pour être précis) ben c'est que la clef [0] n'existe pas. Et donc pour moi l'hypothèse la plus probable était que l'élément dicoval[0] avait été en fait écrit sous syntaxe dicoval["0"].

    Et dans le script présenté comme FAQ, la variable "sp" n'est pas écrasée par la ligne du dessous. Ceci dit c'est pas un des scripts des plus élégants au regard de ce que Python offre comme possibilités...
    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]

  6. #6
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Pour ma part ce que j'aime pas, c'est faire un exec comme ça sur des valeurs certes qu'on est censé connaître, mais sans vérification préalable des valeurs permises, c'est pas très sain comme pratique, déjà quand je suis obligé de placer un eval dans un script, ça me fait comme un gros bouton au milieu de la figure, je n'aime pas du tout, mais alors faire des exec alors qu'on peut aisément faire autrement, c'est vraiment à déconseiller.
    Le temps ronge l'amour comme l'acide.

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