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

  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 754
    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 754
    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 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...

  7. #7
    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... ;-)

  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
    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 ?

  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
    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)

  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
    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...

  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 ?

  13. #13
    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
    PS : Tu es obligé de stocker cela dans un fichier ?
    vu le nombre d'objets, ça me semble le plus pratique (surtout pour les ajouts/modifs)

  14. #14
    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
    vu le nombre d'objets, ça me semble le plus pratique (surtout pour les ajouts/modifs)
    Ok.

    Le code que j'ai posté te permet de faire de toto, tata,... des instances de la class Obj avec les deux paramètres en question...

    Mais pour ton problème je pense que j'utiliserais plutôt un dictionnaire : chaque clé serait une string identifiant une option de ta liste déroulante et la valeur associée serait une instance de ta class.

  15. #15
    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
    dans ton idée, tu peux construire le dictionnaire dynamiquement ( j'ai un doute) ? ou tu dois modifier le dictionnaire dans le programme à chaque fois que tu modifies le fichier (ce qui n'est pas souhaité :-) )

  16. #16
    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
    dans ton idée, tu peux construire le dictionnaire dynamiquement ( j'ai un doute) ? ou tu dois modifier le dictionnaire dans le programme à chaque fois que tu modifies le fichier (ce qui n'est pas souhaité :-) )
    Oui c'est possible...

    Essaye ça (en reprenant le même contenu pour le fichier) :

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

  17. #17
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par alpha.centauri Voir le message
    vu le nombre d'objets, ça me semble le plus pratique (surtout pour les ajouts/modifs)
    En lisant tout ce que tu as écrit, j'ai l'impression que ton truc est absurde. Que tu confonds "objet poo" et "objet".

    En poo un objet est un outil de programation. Il sert à simplifier un concept algorithmique et à le réduire en une somme de valeurs (des attributs) et d'opérations (des méthodes). Si par exemple je veux gérer des comptes bancaires (nom + montant) je peux créer un objet "compte" avec l'attribut "montant" et des méthodes "depose()" et "retire()". Ainsi, une fois l'objet créé, ce sera plus simple quand M. Dupond veut déposer 1000€ d'appeler liste_compte["dupont"].depose(1000) (présumant avoir plusieurs comptes distincts dans le dictionnaire "liste_comptes"). On peut faire sans bien sûr (on peut toujours faire sans) mais dans ce cas le code à écrire sera un peu plus complexe. Bref l'objet sert à simplifier ensuite le code qui s'y appuiera (et c'est bien car il y a généralement plus de code en amont d'un objet qu'en aval donc si on peut simplifier ce code amont c'est plus pratique pour tout le monde).

    Toi je te lis, tu parles d"objets dans un fichier. Admettons. Mais en quoi ces objets serviront ton algorithme que tu souhaites les "instancier" ? Si ces "objets" sont juste des objets de la vie courante (ex voiture+marque+vitesse, figures géométriques+couleur+nb_coté, sport+nb_pratiquants, etc) alors ce ne sont pas des objets au sens poo, juste des valeurs de travail pour ton algorithme. Et dans ce cas ils n'ont pas à être instanciés, simplement stockés en tant que valeur.
    Tu as dit à un moment que tu avais réussi à le faire sans poo, et qu'en poo c'était plus difficile, je veux bien te croire. Parce que justement ces "objets" de ton fichier ne sont pas des objets de poo. A la limite si tu devais faire de la poo là dessus, ce serait alors pour créer un objet destiné à traiter ce fichier, objet qui contiendrait par exemples les méthodes "load()" et "save()".

    Donc d'en ce que je lis, tu parles d'un jeu dans lequel l'utilisateur sélectionne le nom d'un truc dans une liste déroulante, ok je vais pas nier ton besoin mais ce qu'il sélectionne dans une liste déroulante ce ne sont pas des objets, juste des noms. Et ces noms dans le fichier ce n'est pas un objet, c'est de la simple data. Ensuite s'il sélectionne "carre" ben ton algo va traiter cette data et afficher un carré à l'écran (ou autre chose) mais ce n'est pas une raison pour devoir instancier quelque part un objet "carre", cet objet ne sert absolument à rien dans ton code.

    De même tu as dit que ces objets contenaient aussi des méthodes. Là je reste totalement sec. Une méthode c'est avant tout un algorithme qui effectue un traitement et qui produit un résultat. Ce résultat peut-être interne (comme pour ma méthode "compte.depose()" qui se contente d'incrémenter le montant du compte) ou externe (comme par exemple un objet "cercle" pourrait avoir une méthode "perimetre()" qui calcule et renvoie le périmètre) mais ça reste fondamentalement un algorithme, même si cet algorithme se réduit à une seule instruction, et qui produit un résultat utilisable dans le code qui l'appelle. Quels résultats produisent ces fameuses "méthodes" des "objets" de ton fichier? Dans quel langage elles sont écrites? En quoi ces "résultats" sont utiles à ton algo? (si je crée la méthode "perimetre()" c'est parce que je sais que plus tard je devrai récupérer le périmètre d'un cercle). Et surtout enfin comment alors traduire ces "méthodes avec leur propre langage" en "méthodes poo langage Python" ???
    Ou alors ton fichier est une partie de l'algo et dans ce cas tu n'as pas besoin de le lire et le traiter, juste l'écrire en Python et l'importer.

    Non, quelque part je crois qu'il y a eu incompréhension de ta part entre "objet poo" et "objet data" qui t'a alors amené à nous présenter non pas le problème originel mais la solution que tu avais imaginé pour le résoudre. Bref cela ressemble à un cas de problème XY...

    Ceci dit il existe parfois un besoin de sauvegarder ses objets Python dans un fichier. Par exemple pour conserver l'état d'un objet afin de le retrouver plus tard. Cela peut se faire par le module pickle qui contient des méthodes permettant de dumper un objet Python dans un fichier et ensuite de le récupérer. Mais le fichier est alors un fichier "à la sauce pickle" dans lequel tu ne mets pas les pieds.
    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]

  18. #18
    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
    Oui c'est possible...

    Essaye ça (en reprenant le même contenu pour le fichier) :

    [
    voilà qui répond parfaitement au problème

    merci

  19. #19
    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 Sve@r Voir le message
    Bonjour

    En lisant tout ce que tu as écrit, j'ai l'impression que ton truc est absurde. Que tu confonds "objet poo" et "objet".
    c'est clair que c'est pas facile à exprimer quand on est pas un pro (et encore, je connais beaucoup trop de pro qui s'emmêlent les pinceaux )

    mais bon, "absurde", je sais pas...

    pour être plus concret, je défini une classe "étoile" avec deux attributs "AD" et "DEC" et une méthode "hauteur" (je calcule la hauteur d'une étoile en fonction de AD et DEC

    à côté, j'ai une liste d'étoiles dans un fichier avec pour chacune d'entre elle son AD et sa DEC

    si je je décrivais les étoiles dans le programme, je ferai un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    andromède = etoile()
    andromède.AD=1
    andromede.DEC=2
     
    H = andromede.hauteur
    je ne sais pas comment tu appelles l'entité andromède, pour moi c'est un objet instancié de la classe étoile.

    le problème était donc de savoir comment créer cet objet à partir du fichier texte, histoire de ne pas avoir à modifier le programme à chaque nouvelle étoile.

    à priori, la solution de beginner répond bien au problème...

    merci pour ta longue réponse

  20. #20
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alpha.centauri Voir le message
    mais bon, "absurde", je sais pas...
    Le terme est fort mais je l'ai écrit sans penser à mal. Désolé.

    Citation Envoyé par alpha.centauri Voir le message
    pour être plus concret, je défini une classe "étoile" avec deux attributs "AD" et "DEC" et une méthode "hauteur" (je calcule la hauteur d'une étoile en fonction de AD et DEC
    Tu veux bien parler des étoiles en astronomie et non pas d'une figure géométrique...

    Citation Envoyé par alpha.centauri Voir le message
    à côté, j'ai une liste d'étoiles dans un fichier avec pour chacune d'entre elle son AD et sa DEC

    si je je décrivais les étoiles dans le programme, je ferai un truc comme ça:

    andromède = etoile()
    andromède.AD=1
    andromede.DEC=2

    H = andromede.hauteur

    je ne sais pas comment tu appelles l'entité andromède, pour moi c'est un objet instancié de la classe étoile.
    Pour moi c'est une simple étoile. Au sens le plus "neutre" qu'on puisse lui donner. Tout comme il y a différentes voitures (avec des éléments particuliers comme marque, couleur, immatriculation) il y a différentes étoiles avec des éléments particuliers comme magnitude, distance par rapport au soleil, nom, hauteur, etc.
    Donc moi je créerais une classe "etoile" contenant tous les attributs dont mon algorithme a besoin, puis ensuite j'instancierais différentes étoiles à partir des infos lues dans le fichier. Le fichier lui n'a même pas besoin de savoir qu'il sera traité par ton algo ou par un autre, à la limite ça peut être du bête CSV. C'est ton algo qui fera la conversion "info lue => instanciation d'une étoile" (séparation "modèle" du "contrôleur" en terminologie "programmation MVC")

    Citation Envoyé par alpha.centauri Voir le message
    le problème était donc de savoir comment créer cet objet à partir du fichier texte, histoire de ne pas avoir à modifier le programme à chaque nouvelle étoile.
    Si ton fichier est "neutre" (dans le sens qu'il ne se sent pas obligé de correspondre à un langage particulier mais reste dans son role de fichier data) pas de souci. C'est ton algo qui lui se charge de le lire et en extraire les infos pour les charger dans ton objet à toi.

    Prends le fichier suivant (nommé "fic" chez-moi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Andromede:1:2
    Alpha Centauri:5:8
    Aldebaran:12:42
    Je peux le traiter ainsi
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    class star:
    	def __init__(self, nom="", AD=0, DEC=0):
    		self.nom=nom
    		self.AD=AD
    		self.DEC=DEC
    	# __init__()
     
    	def load(self, ligne, sep):
    		info=ligne.split(sep)
    		self.nom=info[0]
    		self.AD=int(info[1])
    		self.DEC=int(info[2])
    	# load()
     
    	def __str__(self):
    		return "Etoile {}: AD={}, DEC={}".format(self.nom, self.AD, self.DEC)
    # star()
     
    galaxie=list()
    with open("fic", "r") as fp:
    	for line in fp:
    		galaxie.append(star())
    		galaxie[-1].load(line.strip(), ":")
    	# for
    # with
     
    for (i, g) in enumerate(galaxie, 1):
    	print(i, g)

    Mais si je ne me sens pas la nécessité de changer une étoile (une fois crée elle reste ainsi), alors le code pourra être le suivant (l'étoile est créee à l'instanciation à partir de la ligne du ficher)
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    class star:
    	def __init__(self, ligne, sep):
    		info=ligne.split(sep)
    		self.nom=info[0]
    		self.AD=int(info[1])
    		self.DEC=int(info[2])
    	# __init__()
     
    	def __str__(self):
    		return "Etoile {}: AD={}, DEC={}".format(self.nom, self.AD, self.DEC)
    # star()
     
    galaxie=list()
    with open("fic", "r") as fp:
    	for line in fp:
    		galaxie.append(star(line.strip(), ":"))
    # with
     
    for (i, g) in enumerate(galaxie, 1):
    	print(i, g)

    Si maintenant tu veux pouvoir "sélectionner" une étoile particulière...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    galaxie=dict()
    with open("fic", "r") as fp:
    	for line in fp:
    		e=star(line.strip(), ":")
    		galaxie[e.nom]=e
    # with
     
    choix=input("Quelle étoile désirez-vous ?")
    if choix in galaxie.keys():
    	print(galaxie[choix])
    else:
    	print("Etoile {} inconnue".format(choix))
    # if

    Et il y a plein d'autres façons de faire. Bon cet exemple c'est du "vite fait" (j'utilise un bête split() pour traiter les ":" alors que le module "csv" pourra mieux gérer les trucs plus complexes qu'il puisse se passer au sein d'un CSV) mais c'est pour l'exemple. Le fichier contient des ":", le code lui est assez souple pour prendre autre chose (c'est l'appelant qui choisit son séparateur)...

    Donc tout est possible pour peu que tu ne t'attaches pas à imaginer que "une étoile en particulier" mérite son propre objet. C'est comme pour les nombres. Il existe l'objet "int" qui permet de gérer "un nombre en général" et qui de fait peut les gérer tous, pas besoin d'un objet "int_5" pour gérer le nombre 5.

    Citation Envoyé par alpha.centauri Voir le message
    à priori, la solution de beginner répond bien au problème...
    Quelque chose me dit que cela n'y répondra que pour une courte durée...
    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]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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