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 :

creation d'objet à partir d'un fichier texte.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut creation d'objet à partir d'un fichier texte.
    hello,

    j'ai beau chercher, j'ai rien trouvé et je me demande maintenant si python sait faire :

    mon pb :

    je crée une classe "obj" avec, disons, deux attributs

    j'ai un fichier texte qui contient n lignes de type : "toto 2 3", "tata 6 3", etc...

    est-il possible de lire le fichier et de créer des objets toto, tata... appartenant à la classe "obj" et d'instancier ces objets avec les valeurs contenues dans le fichier ?


    là ou j'en suis :

    je lis les lignes, je les split (x=ligne.split()) ,et je fais un globals()[x[0]] = obj()
    je trouve bien un objet toto qui appartient à la classe obj()

    mais je ne trouve pas comment instancier toto avec les valeurs 2 et 3 , je me retrouve toujours avec les valeurs par défaut de obj


    quelqu'un sait si c'est faisable, et comment ?

    merci

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonsoir,

    penchez-vous sur setattr, vous pourrez choisir entre toto ou tata comme attributs de votre classe à alimenter avec les valeurs lues dans votre fichier d'entrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setattr(ma_classe, 'mon_attribut', 'ma_valeur')

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut
    ben non, ça marche pas mieux :-)

    le pb, c'est que le programme ne connait pas toto ou tata, il ne connait que x[0], et même si la valeur de x[0] (toto) correspond bien à un objet de la classe obj; python ne reconnait pas x[0] comme appartenant à la classe, je ne peux donc pas instancier.

    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
    class obj:
     
             #constructeur
             def __init__(self):
             #lister les champs
                 AD = 0.0
                 DEC = 0.0
     
             #fin constructeur        
     
    pass
     
    filin = open("fic.txt", "r")
    ligne = filin.readline()
    x = ligne.split()
    globals()[x[0]] = obj()
    setattr(x[0],AD, x[2])
    filin.close()
    ça donne :
    name 'AD' is not defined
    alors que toto donne bien :
    <__main__.objet at 0x7f6f5d7c9978>

  4. #4
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut
    ah, avec les guillemets autour de AD, c'est pas mieux : AttributeError: 'str' object has no attribute 'AD' :-(

    le truc, c'est comment faire pour que python comprenne "toto" en voyant "x[0]", c'est peut-être pas possible...

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

    Citation Envoyé par alpha.centauri Voir le message
    est-il possible de lire le fichier et de créer des objets toto, tata... appartenant à la classe "obj" et d'instancier ces objets avec les valeurs contenues dans le fichier ?
    Ca n'a rien de magique.

    Si on définit la classe par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A:
          def __init__(self, name, x, y):
                self.name = name
                self.x = x
                self.y = y
    instancier une instance se fera via A('toto', 2, 3).

    Reste à transformer la ligne "toto 2 3\n" en le tuple t = ('toto', 2, 3) pour instancier le A via A(*t)

    Ceci dit, un tel fichier, c'est des lignes avec des colonnes "nom", "x", "y". Le plus simple est d'en faire un tableau avec une liste de listes.
    Vous aurez le même résultat sans utiliser les class (qu'il faut apprendre avant).

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

  6. #6
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Ca n'a rien de magique.

    Si on définit la classe par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A:
          def __init__(self, name, x, y):
                self.name = name
                self.x = x
                self.y = y
    instancier une instance se fera via A('toto', 2, 3).

    Reste à transformer la ligne "toto 2 3\n" en le tuple t = ('toto', 2, 3) pour instancier le A via A(*t)

    Ceci dit, un tel fichier, c'est des lignes avec des colonnes "nom", "x", "y". Le plus simple est d'en faire un tableau avec une liste de listes.
    Vous aurez le même résultat sans utiliser les class (qu'il faut apprendre avant).

    - W

    euh, j'ai peut-être loupé un truc, mais en faisant ça, je retrouve pas l'objet "toto" (name 'toto' is not defined)

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par alpha.centauri Voir le message
    euh, j'ai peut-être loupé un truc, mais en faisant ça, je retrouve pas l'objet "toto" (name 'toto' is not defined)
    Oui c'est normal, dans le code de wiztricks, toto n'est pas une instance de la class A, ce n'est même pas une variable, en fait c'est la chaine "toto" qui se retrouve être la valeur de la propriété name de la class A.

    Tu peux tester cela pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A:
          def __init__(self, name, x, y):
                self.name = name
                self.x = x
                self.y = y
     
     
    instance_A = A('toto', 2, 3)
    print("instance_A.name:",instance_A.name) # affiche: instance_A.name: toto
    print("instance_A.x:",instance_A.x)
    print("instance_A.y:",instance_A.y)
    C'est pour cela qu'il faut que tu précises bien ce que tu veux...

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par alpha.centauri Voir le message
    je crée une classe "obj" avec, disons, deux attributs

    j'ai un fichier texte qui contient n lignes de type : "toto 2 3", "tata 6 3", etc...

    est-il possible de lire le fichier et de créer des objets toto, tata... appartenant à la classe "obj" et d'instancier ces objets avec les valeurs contenues dans le fichier ?
    Peut-être que tu devrais revoir le problème pour éviter d'avoir à faire cela. Il y a d'autres façons de "stocker" des objets dans un fichier...


    Mais bon je propose le code ci-dessous qui fait ce que tu veux faire (du moins ce que j'ai compris de ce que tu veux faire), je reprends ton code que j'adapte :

    Contenu du fichier fic.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto 2 3
    tata 6 1
    titi 7 5
    Et le code avec des tests à la fin :

    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
    class Obj:
        def __init__(self, p1, p2):
            self.AD = p1
            self.DEC = p2
     
    filin = open("fic.txt", "r")
    for ligne in filin:
        x = ligne.split()    
        exec("%s = Obj(%s,%s)" % (x[0], x[1], x[2]))
    filin.close()
     
    # tests :
    print("toto.AD:", toto.AD, "toto.DEC:", toto.DEC)
    print("tata.AD:", tata.AD, "tata.DEC:", tata.DEC)
    print("titi.AD:", titi.AD, "titi.DEC:", titi.DEC)

    Résultats des tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto.AD: 2 toto.DEC: 3
    tata.AD: 6 tata.DEC: 1
    titi.AD: 7 titi.DEC: 5
    toto, tata et titi sont bien des instances de la class Obj...

    J'ai testé et cela fonctionne mais je ne dis pas que c'est une bonne pratique de faire comme cela...

  9. #9
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut
    en fait, c'est quand même un peu plus compliqué, il n'y a pas que des attributs dans mes objets, y a aussi des méthodes...

    c'est clair que je pourrais sans doute faire ça "à l'ancienne", mais bon, y parait que l'OO, c'est mieux :-) :-) :-)

    oui, c'est bien le résultat cherché; merci pour ton code, c'est sûr que j'aurais pas trouvé ça tout seul en lisant la doc ...

    j'essaye de comprendre ce que tu as écris, et je teste ça demain... ;-)

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par alpha.centauri Voir le message
    en fait, c'est quand même un peu plus compliqué, il n'y a pas que des attributs dans mes objets, y a aussi des méthodes...
    Que veux-tu faire exactement ? Ce que j'ai compris c'est que tu voulais que toto, tata... etc soient des instances de la class Obj et que tu veux "...instancier ces objets avec les valeurs contenues dans le fichier" mais ces valeurs sont censées initialiser quelles propriétés ? J'ai déduis de ton code que c'était AD et DEC, est-ce bien cela ?

  11. #11
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Que veux-tu faire exactement ? Ce que j'ai compris c'est que tu voulais que toto, tata... etc soient des instances de la class Obj et que tu veux "...instancier ces objets avec les valeurs contenues dans le fichier" mais ces valeurs sont censées initialiser quelles propriétés ? J'ai déduis de ton code que c'était AD et DEC, est-ce bien cela ?
    si tu veux tout savoir, l'idée c'était de définir une classe avec ses propriétés (AD, DEC) et ses méthodes (AD+DEC, par exemple)

    j'ai un fichier texte de n lignes avec, pour chaque ligne, le nom de l'objet, son AD et son DEC

    le but du jeu est de sélectionner le nom de l'objet via une liste déroulante et de retourner son AD+DEC correspondant.

    ça se fait très bien sans programmation objet, mais je n'avais pas encore eu l'occasion de l'utiliser pour faire ce genre de chose...

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par alpha.centauri Voir le message

    ça se fait très bien sans programmation objet, mais je n'avais pas encore eu l'occasion de l'utiliser pour faire ce genre de chose...
    Quand je te disais que tu pouvais faire autrement je ne voulais pas te dire de ne pas utiliser la POO...



    Citation Envoyé par alpha.centauri Voir le message
    si tu veux tout savoir, l'idée c'était de définir une classe avec ses propriétés (AD, DEC) et ses méthodes (AD+DEC, par exemple)

    j'ai un fichier texte de n lignes avec, pour chaque ligne, le nom de l'objet, son AD et son DEC

    le but du jeu est de sélectionner le nom de l'objet via une liste déroulante et de retourner son AD+DEC correspondant.
    Ok mais pour cela tu n'es pas obligé de faire en sorte que toto soit une instance de la class Obj, le nom de l'objet pourrait juste être une string pour identifier l'objet et là on en revient au code proposé par wiztricks qui est un début de solution...

    Mais si tu tiens quand même à faire cela (c'est-à-dire faire en sorte que toto soit une instance de la class Obj) alors tu peux tester le code que j'ai proposé...

    Si les noms d'objets sont connus à l'avance et que seuls les valeurs sont différentes alors tu peux simplifier les choses...

    PS : Tu es obligé de stocker cela dans un fichier ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ajout de données à partir d'un fichier texte
    Par drakenzara dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 14/04/2006, 12h39
  2. Réponses: 4
    Dernier message: 26/01/2006, 12h03
  3. Lancer des commandes dos à partir d'un fichier texte
    Par tpdm dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/08/2005, 16h56
  4. état à partir d'un fichier texte
    Par onkel dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/07/2005, 10h26
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

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