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 :

Problème lecture de fichier python


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 28
    Points : 24
    Points
    24
    Par défaut Problème lecture de fichier python
    Bonjour à tous,
    Bon voilà j'essaye de faire un programme qui créer un "treillis" (élément de structure mécanique) à partir de données entrées dans un fichier texte.
    Dans un premier temps j'ai rentré les données "Noeuds" ( identifiant du noeud, coordonnées x et y ) me permettant de créer les noeuds à partir de ma classe Noeud en lisant le fichier.
    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
    #!/usr/bin
    # -*- coding: utf-8 -*-
     
    import numpy as np
    import numpy.linalg as npla
    import elements as ef
    import math as m 
     
     
    def Lecture(src):
    	headline = src.readline().rstrip('\n\r').split("|")
    	Idt_Noeud = headline.index("Idt Noeud")
    	coord_x=headline.index("coord x")
    	coord_y=headline.index("coord y")
     
    	#Lecture et création des noeuds (Creation of the Nodes by reading the "Données_Utilisateur.txt" file)
    	i=0
    	n=[0,0,0,0,0,0,0]
    	for ligne in src:
    		data= ligne.rstrip('\n\r').split("|")
    		n[i]=(ef.Noeud(data[Idt_Noeud],data[coord_x],data[coord_y]))
    		i=i+1
    	return n
    # TEST: print the nodes' id and coordinates
    source= open("Données_Utilisateur.txt", "r")
    n=Lecture(source)
    l=len(ef.dicoNoeud)
     
    for i in range (l):
    	print"idt n°",i+1,":",n[i].idt,"x:",n[i].x,"y:",n[i].y,"\n"
     
    source.close()
    et le fichier Données_Utilisateur.txt
    "
    Idt Noeud|coord x|coord y
    1|0.00|0.00
    2|0.85|0.85
    3|1.70|0.00
    4|2.55|0.85
    5|3.40|0.00
    6|4.25|0.85
    7|5.10|0.00
    "
    Mon programme fonctionne à condition que "Idt Noeud|coord x|coord y" reste à la première ligne et je cherche un moyen pour que mon programme trouve cette ligne automatiquement.
    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def Lecture(src):
    	Noeud="Idt Noeud|coord x|coord y"
    	for ligne  in src:
    		if Noeud in ligne
    			break
    		else:
    			print"cherche encore"
    	headline = src.readline().rstrip('\n\r').split("|")
    	print"",headline
    Mais çe ne fonctionne pas et je galère depuis quelques heures déjà ^^'.
    En éspèrant avoir été assez clair, merci par avance de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 10
    Points
    10
    Par défaut
    Hey Dude

    Si je comprends bien, tu voudrais sauter toutes les lignes avant ton en-tête?

    Je tenterais d'abord ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def Lecture(src):
    	Noeud="coord"    # Note 1
    	for ligne  in src:
    		if Noeud in ligne
                            header = ligne # Note 2
    			break
    		else:
    			print"cherche encore"
    	headline = header.rstrip('\n\r').split("|") # Note 2
    	print"",headline
    Note 1: cette modification permet d'esquiver des erreurs d'écriture de ton fichier de données (espace en plus, en moins etc)
    Note 2: au moment du break tu viens en fait de faire un readline() sur la ligne contenant le header. A la sortie de ta boucle, tu refaisais un readline(), ce qui t'amenait à traiter ta première ligne de données en fait et pas ton header...


    J'espère t'avoir aidé un peu!

    Bon maillage

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,
    Tout d'abord merci pour ta réponse, c'est bien ce que je cherchais à faire.
    J'ai finis par y arriver (tant bien que mal mon code est assez barbare ), je connaissais pas la méthode header je l'intégrerai à mon code prochainement.
    Je ne compte pas réaliser un maillage ^^, une fois le treillis crée, mon but sera d'optimiser la masse en faisant varier la longueur des éléments barres et la section en fonction de la contrainte limite (MPa).

    La lecture fonctionne cependant je suis confronté à une erreur lorsque j'essaye d'appliquer une propriété à mes éléments lors de la créations des noeuds, il ne parvient pas à appliquer la méthode distance noeud.

    Voici le morceau de code ou je créer mes noeuds et mes éléments:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #Lecture/Création des noeuds dans (n[]), vecteurs des déplacements autorisés et vecteurs des efforts
    	i=0
    	n=[]
        deplacements=[]
        efforts=[]
        for ligne in src:
            if (ligne==f[fin_n]):
        	    break
            data= ligne.rstrip('\n\r').split("|")
            n.append(0)
            deplacements.append(int(data[u]))
            deplacements.append(int(data[v]))
            efforts.append(float(data[fx]))
            efforts.append(float(data[fy]))
            n[i]=ef.Noeud(int(data[Idt_Noeud]),float(data[coord_x]),float(data[coord_y]))
            i=i+1
    #Même procédure pour les éléments Barres
        src.seek(0)
        for i in range(debut_e):
            src.readline()
     
    #On classe les éléments dans le tableau e[]
        headline = src.readline().rstrip('\n\r').split("|")
        Idt_Ele=headline.index("Idt Element")
        Idt_Nd1=headline.index("Idt Noeud1")
        Idt_Nd2=headline.index("Idt Noeud2")
        Module_E=headline.index("Module E")
        Section=headline.index("Section")
        i=0
        e=[]
        for ligne in src:
            if (ligne==f[fin_e]):
                break
            e.append(0)
            data= ligne.rstrip('\n\r').split("|")
            id_1= int(data[Idt_Nd1])-1
            id_2= int(data[Idt_Nd2])-1
            e[i]=ef.Barre( int(data[Idt_Ele]), n[id_1].idt, n[id_2].idt)
            print"type noeud",type(n[id_1])
    #Problème lorsque j'essaie d'appliquer les propriétés lues à l'éléments, le noeud ne semble pas être reconnu en tant qu'instance de Noeud et la longueur ne peut donc pas être déterminée (ligne82)
            #e[i].setProp(float(data[Module_E]),float(data[Section]))
            i=i+1	
        return (n,deplacements,efforts,e)
    Et voici un exemple de création de Noeuds et de Barres fonctionnel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    n1 = ef.Noeud(1,0.,0.)
    e1=ef.Barre(1,n1,n2)
    e1.setProp(70000.,2.)
    Je ne suis pas parvenu à trouver l'origine du problème, j'ai vérifier que mes instances étaient bien des Noeuds et des Elements, j'ai forcer le changement de type 'str' en float/integer mais rien n'y fait.
    Je joint le code treillis et le code éléments (qui contient les classe barre et noeud), ainsi que le document texte contenant des données.
    L'erreur s'affiche ligne 82 (mise en commentaire pour permettre l'execution temporairement).

    Merci pour votre aide,
    Cordialement,
    Fichiers attachés Fichiers attachés

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Désolé pour le temps de réponse, j'imagine que tu as déjà résolu ton problème...
    Le soucis se situe ligne 79 dans Treillis.

    Quand tu créé ton objet Barre, tu lui fais passer l'identifiant de ton noeud (idt qui est un entier), au lieu de lui passer l'objet lui-même. Du coup, au sein de ta classe Barre, tu n'as pas accès aux propriétés du Noeud.
    Pour résoudre ça, il faut remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e[i]=ef.Barre( int(data[Idt_Ele]), n[id_1].idt, n[id_2].idt)
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e[i]=ef.Barre( int(data[Idt_Ele]), n[id_1], n[id_2])
    Et tout va mieux

    J'espère que je suis clair, n'hésite pas si tu as besoin de plus d'infos


    PS: il est possible de simplifier énormément ta lecture du fichier, je t'envoie ça très vite

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 10
    Points
    10
    Par défaut
    Voici une version plus "pythonique", simple et efficace de la lecture du fichier

    Si tu as la moindre question, n'hésite pas (ce coup-ci j'aurai un mail si tu reponds, ce qui n'était pas le cas....)


    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    def Lecture_Noeud(src):
        content = src.readlines() # on lit tout
        read_node = False # on n'est pas en train de lire un noeud
        read_elt = False # ni un element
        # initialisation des listes
        deplacements = []
        efforts = []
        n = []
        e = []
        # c'est parti, on boucle sur les lignes
        for ligne in content:
            if '///' in ligne or '!!!' in ligne: # on saute les commentaires
                continue
            if read_node: # lecture noeud
                if '/END' in ligne: # si on est au bout, on passe à l'itération suivante
                    read_node = False
                    continue
                else: # sinon on lit
                    data = ligne.split('|')
                    deplacements.append(int(data[u]))
                    deplacements.append(int(data[v]))
                    efforts.append(float(data[fx]))
                    efforts.append(float(data[fy]))
                    n.append(ef.Noeud(int(data[Idt_Noeud]),float(data[coord_x]),float(data[coord_y])))
     
            elif read_elt: # lecture elt
                if '/END' in ligne: # si on est au bout, on passe à l'itération suivante
                    read_elt = False
                    continue
                else: # sinon on lit
                    data = ligne.split('|')
                    id_1= int(data[Idt_Nd1])-1
                    id_2= int(data[Idt_Nd2])-1
                    e.append(ef.Barre( int(data[Idt_Ele]), n[id_1], n[id_2]))
                    print"type noeud",type(n[id_1])
                    e[-1].setProp(float(data[Module_E]),float(data[Section])) # -1 est le dernier de la liste, celui qui vient d'etre ajouté
            else: # sinon, on teste l'entrée dans un noeud ou un elt
                if 'Idt Noeud|' in ligne: # on entre dans un noeud et on initialise les index. Le | permet de ne pas lire le Idt Noeud dans le première ligne d'un element :)
                    read_node = True
                    headline = ligne.strip().split("|") #strip() élimine espaces, \t, \r, \n au début et à la fin
                    Idt_Noeud = headline.index("Idt Noeud")
                    coord_x=headline.index("coord x")
                    coord_y=headline.index("coord y")
                    u=headline.index("u")
                    v=headline.index("v")
                    fx=headline.index("fx")
                    fy=headline.index("fy")
                elif 'Idt Element' in ligne:
                    read_elt = True
                    headline = ligne.strip().split("|")
                    Idt_Ele=headline.index("Idt Element")
                    Idt_Nd1=headline.index("Idt Noeud1")
                    Idt_Nd2=headline.index("Idt Noeud2")
                    Module_E=headline.index("Module E")
                    Section=headline.index("Section")
        return (n,deplacements,efforts,e)

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

Discussions similaires

  1. [NASM] Petits problèmes lecture de fichier
    Par Jaronimo dans le forum Assembleur
    Réponses: 1
    Dernier message: 01/05/2008, 14h56
  2. [XPATH] problème lecture dans fichier XML
    Par DiamonDonald dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/02/2008, 09h57
  3. Problème lecture gros fichier texte
    Par UnnamedBoy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/02/2008, 11h13
  4. problème lecture seule fichier image
    Par Damien69 dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2007, 16h53
  5. problème lecture de fichier
    Par nico33410 dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2006, 20h01

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