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 :

génération de fichier.txt


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Par défaut génération de fichier.txt
    Bonjour,

    j'ai fait un programme sur Python pour extraire des données du fichiers .odb issues de l'Abaqus. le code est le suivant:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    from odbAccess import*
    from abaqusConstants import*
    from odbMaterial import*
    from odbSection import*
     
    output=open('hcf2.txt','w')
     
    odb = openOdb(path='hcf.odb')
     
    myAssembly = odb.rootAssembly
    for instanceName in odb.rootAssembly.instances.keys():
        print 'Instance Name : ',instanceName
     
    print 'Node sets = ',odb.rootAssembly.instances['V20110406-1-1'].nodeSets.keys()
    print 'element sets = ',odb.rootAssembly.instances['V20110406-1-1'].elementSets.keys()
     
    allMaterials = odb.materials
    for materialName in allMaterials.keys():
        print 'Material Name : ',materialName
     
    allSections = odb.sections
    for sectionName in allSections.keys():
        print 'Section Name : ',sectionName
     
    for mySection in allSections.values():
        if type(mySection) == HomogeneousSolidSectionType:
            print 'material name = ',mySection.material
     
     
    instances = odb.rootAssembly.instances
    for instance in instances.values():
        assignments = instance.sectionAssignments
        print 'Instance : ',instance.name
        for sa in assignments:
            region = sa.region
            elements = region.elements
            print ' Elements associated with this section : '
            for e in elements:
                #print ' label : ',e.label
                output.write ('Instance: %s\t label: %6d\n'%(instance.name,e.label))
     
    for stepName in odb.steps.keys():
        print stepName
     
     
    #step1 = odb.steps.values()[0]
    #print step1.name
     
    lastFrame = odb.steps['Load'].frames[-1]
    for fieldName in lastFrame.fieldOutputs.keys():
        print fieldName
     
    # for each field output value in the last frame, print the name, description, and type members.
    for f in lastFrame.fieldOutputs.values():
        print f.name,':', f.description
        print 'type: ', f.type
     
    displacement = lastFrame.fieldOutputs['U']
    fieldValues = displacement.values
     
    #for each displacement value, print the nodelabel and data members
     
    for v in fieldValues:
        # print 'Node = %d, U[x] = %6.4f, U[y]= %6.4f' % (v.nodeLabel, v.data[0], v.data[1])
        output.write ('Node: %d\t U[x]: %6.4f\t U[y]: %6.4f\n'%(v.nodeLabel,v.data[0],v.data[1]))
     
    center = odb.rootAssembly.instances['V20110406-1-1'].nodeSets['SKIN']
    centerDisplacement = displacement.getSubset(region=center)
    centerValues = centerDisplacement.values
    for v in centerValues:
        #print v.nodeLabel, v.data
        output.write ('Node: %d\t Data: %s\n'%(v.nodeLabel,v.data))
    en ligne 7 j'ai créé un fichier .txt qui va contenir certaines résultats; en ligne 41 j'ai choisi quelques output à afficher sur ce fichier
    et en ligne 66 j'ai inséré des autres output sur le même fichier mais j'ai voulu que ces derniers output s'affichent dans la colonne suivante mais pas dans la ligne suivante .
    je ne sais pas que ma question est claire )

    merci d'avance

  2. #2
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    et c'est quoi la question ?

  3. #3
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Hmmmm... si ton problème c'est que le dernier ajout de données (ligne 66) dans le fichier se retrouve sur une ligne à part, et pas sur la même ligne que l'ajout ayant eu lieu en ligne 41 ; he bien il suffit de ne pas mettre de '\n' à la fin de l'ajout ayant eu lieu en ligne 41, c'est tout ('\n' est un retour à la ligne)

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Bon je crois que ce que tu veux, c’est un genre de présentation en tableau… Pas possible de faire ça directement –*il faut passer par un objet intermédiaire, genre liste, qui stocke tes lignes, comme ça tu peux rajouter à tout moment du texte à la ligne que tu veux. Et tu écris tout d’un coup, une fois que tu es sûre d’en avoir fini…

    Mais on peut aussi avoir quelque chose de plus avancé, comme un genre d’objet tableau qui permette d’écrire ce qu’on veut à la ligne x, colonne y, et assure une mise en forme potable, par exemple*:

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    from odbAccess import*
    from abaqusConstants import*
    from odbMaterial import*
    from odbSection import*
     
    class Table(object):
        def __init__(self):
            # self.table est un tableau de cellules, donc bi-dimensionnel.
            self.table=[]
            self.height = 0
            self.width = 0
     
        def set_at(self, row, col, text):
            # On agrandi self.table autant que nécessaire, dans les deux directions.
            if col >= self.width:
                for r in self.table:
                    r.extend(["" for i in range(col - self.width + 1)])
                self.width = col + 1
            if row >= self.height:
                self.table.extend([["" for i in range(self.width)] for j in range(row - self.height + 1)])
                self.height = row + 1
            self.table[row][col] = text
     
        def to_string(self, colsep = '\t'):
            # Ici, la difficulté est de rajouter des espaces au contenu des cellules,
            # de façon à avoir toujours le même nombre de signes dans une colonne…
            col_max_len = [max(map(len,e)) for e in zip(*self.table)]
            ret = []
            for r in self.table:
                l = []
                for i, c in enumerate(r):
                    l.append("".join((c, " "*(col_max_len[i]-len(c)))))
                ret.append(colsep.join(l))
            return "\n".join(ret)
     
    output = Table()
     
    odb = openOdb(path='hcf.odb')
     
    myAssembly = odb.rootAssembly
    for instanceName in odb.rootAssembly.instances.keys():
        print 'Instance Name : ',instanceName
     
    print 'Node sets = ',odb.rootAssembly.instances['V20110406-1-1'].nodeSets.keys()
    print 'element sets = ',odb.rootAssembly.instances['V20110406-1-1'].elementSets.keys()
     
    allMaterials = odb.materials
    for materialName in allMaterials.keys():
        print 'Material Name : ',materialName
     
    allSections = odb.sections
    for sectionName in allSections.keys():
        print 'Section Name : ',sectionName
     
    for mySection in allSections.values():
        if type(mySection) == HomogeneousSolidSectionType:
            print 'material name = ',mySection.material
     
     
    instances = odb.rootAssembly.instances
    row = 0
    for instance in instances.values():
        assignments = instance.sectionAssignments
        print 'Instance : ',instance.name
        for sa in assignments:
            region = sa.region
            elements = region.elements
            print ' Elements associated with this section : '
            for e in elements:
                #print ' label : ',e.label
                output.set_at(row, 0, 'Instance: %s'%instance.name)
                output.set_at(row, 1, 'label: %6d'%e.label)
                row += 1
     
    for stepName in odb.steps.keys():
        print stepName
     
     
    #step1 = odb.steps.values()[0]
    #print step1.name
     
    lastFrame = odb.steps['Load'].frames[-1]
    for fieldName in lastFrame.fieldOutputs.keys():
        print fieldName
     
    # for each field output value in the last frame, print the name, description, and type members.
    for f in lastFrame.fieldOutputs.values():
        print f.name,':', f.description
        print 'type: ', f.type
     
    displacement = lastFrame.fieldOutputs['U']
    fieldValues = displacement.values
     
    #for each displacement value, print the nodelabel and data members
     
    row = 0
    for v in fieldValues:
        # print 'Node = %d, U[x] = %6.4f, U[y]= %6.4f' % (v.nodeLabel, v.data[0], v.data[1])
        output.set_at(row, 2, 'Node: %d'%v.nodeLabel)
        output.set_at(row, 3, 'U[x]: %6.4f'%v.data[0])
        output.set_at(row, 4, 'U[y]: %6.4f'%v.data[1])
     
    with open('hcf2.txt','w') as f:
        f.write(output.to_string())
    Le truc reste assez basique, mais permet déjà de faire ce que tu veux, si j’ai bien compris (j’ai shunté la dernière partie de ton code, comme tu ne nous dis pas où tu veux mettre ces writes-là…).

  5. #5
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Pas possible de faire ça directement –*il faut passer par un objet intermédiaire, genre liste, qui stocke tes lignes, comme ça tu peux rajouter à tout moment du texte à la ligne que tu veux.
    Hmmm... cela peut se révéler vrai si et seulement si, on a besoin de modifier une donnée déjà écrite dans le fichier, ou d'insérer une ligne entre deux déjà existantes, ce genre de choses...
    Mais si on ne fait qu'ajouter des données déjà dans l'ordre voulu, cela se révélerait alors être une lourdeur et une occupation mémoire bien inutile. Comme utiliser un tank pour interpeller un piéton...


    PS : je n'ai lu aucun de vos codes, hormis les trois lignes indiquées dans le premier message.

  6. #6
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    N.tox, si j’ai bien compris foufaa33, elle veut écrire deux premières colonnes de données dans sa première boucle, puis trois autres colonnes de données dans sa deuxième boucle –*autrement dit, revenir à la première ligne pour y rajouter trois colonnes supplémentaires…

    Donc, d’une manière ou d’une autre, il lui faut bien stocker temporairement ses données texte de la première boucle, et leur ajouter celles de la deuxième, avant de pouvoir écrire le tout.

    Évidemment, si c’était du ligne à ligne classique, le problème ne se poserait pas…

Discussions similaires

  1. Génération de fichier TXT
    Par AnorkGD dans le forum Débuter
    Réponses: 3
    Dernier message: 05/04/2013, 11h02
  2. Génération de fichiers Txt à l'aide d'une requête
    Par mourad.ardouz dans le forum VBA Access
    Réponses: 1
    Dernier message: 01/02/2011, 12h32
  3. Optimisation de code, génération de fichiers (.txt et .xls)
    Par shadypierre dans le forum VBA Access
    Réponses: 4
    Dernier message: 17/03/2010, 18h06
  4. Génération de fichier .txt exploitable
    Par TekFanatiX dans le forum Langage
    Réponses: 5
    Dernier message: 15/06/2009, 14h57
  5. génération d'un fichier txt
    Par warning dans le forum C++
    Réponses: 3
    Dernier message: 09/04/2007, 14h42

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