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 saut de ligne incompréhensible [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Problème saut de ligne incompréhensible
    Bonjour à tous,

    Je viens vers vous car j'ai un petit soucis sur un petit script. Cela fait un petit moment que j'ai pas codé un script en python et là je sèche.

    Pour vous expliquer mon problème je vous explique ce que je fais.

    Alors j'ai un fichier contenant des cartes GRID (fichier calcul Nastran pour les connaisseurs) et d'autres cartes divers. Mon script ne s'occupe que des cartes GRID et il a pour but de changer l'ID de la carte.

    Voici un exemple de carte GRID :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRID     86725          8290.   1863.13 2003.55
    Dans cet exmple l'ID c'est le 86725 et mon script le change comme il le faut.

    Mon soucis intervient quand je tombe sur une ligne qui n'est pas une carte GRID et dans ce cas je demande à mon script de ré-écrire la ligne telle quelle.

    Sauf que j'ai un soucis de saut de ligne que je n'arrive pas à comprendre.

    Alors voici le fichier d'entré que j'utilise avec la ligne qui commence par CROD pour le test MPC_NODE.rar :

    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
     
    GRID     86725          8290.   1863.13 2003.55                                 
    GRID     86726          8290.   1842.13 2003.55                                 
    GRID     86727          8290.   1821.13 2003.55                                 
    GRID     86728          8290.   1800.13 2003.55                                 
    GRID     86729          8288.   1750.   2003.55
    CROD     10000                                 
    GRID     86730          8288.   1726.   2003.55                                 
    GRID     86731          8288.   1689.   2003.55                                 
    GRID     86732          8288.   1665.5  2003.55                                 
    GRID     86733          8288.   1642.   2003.55                                 
    GRID     86734          8288.   1617.9  2003.55                                 
    GRID     86735          8288.   1593.8  2003.55                                 
    GRID     86736          8288.   1569.7  2003.55                                 
    GRID     86737          8288.   1545.6  2003.55                                 
    GRID     86738          8288.   1521.5  2003.55                                 
    GRID     86739          8288.   1498.   2003.55                                 
    GRID     86740          8288.   1474.5  2003.55                                 
    GRID     86741          8288.   1437.5  2003.55                                 
    GRID     86742          8288.   1414.   2003.55                                 
    GRID     86743          8288.   1390.5  2003.55                                 
    GRID     86744          8288.   1369.4  2003.55                                 
    GRID     86745          8288.   1348.3  2003.55                                 
    GRID     86746          8288.   1327.2  2003.55                                 
    GRID     86747          8288.   1306.1  2003.55                                 
    GRID     86748          8288.   1285.   2003.55                                 
    GRID     86749          8288.   1261.5  2003.55                                 
    GRID     86750          8288.   1238.   2003.55                                 
    GRID     86751          8288.   1201.   2003.55                                 
    GRID     86752          8288.   1177.5  2003.55                                 
    GRID     86753          8288.   1154.   2003.55                                 
    GRID     86754          8288.   1131.42 2003.55                                 
    GRID     86755          8288.   1108.83 2003.55                                 
    GRID     86756          8288.   1086.25 2003.55                                 
    GRID     86757          8288.   1063.67 2003.55                                 
    GRID     86758          8288.   1041.08 2003.55                                 
    GRID     86759          8288.   1018.5  2003.55                                 
    GRID     86760          8288.   995.    2003.55                                 
    GRID     86761          8288.   971.5   2003.55                                 
    GRID     86762          8290.   934.5   2003.55                                 
    GRID     86763          8290.   903.017 2005.55                                 
    GRID     86764          8290.   881.443 2005.55                                 
    GRID     86765          8290.   859.869 2006.55                                 
    GRID     86766          8290.   838.295 2006.55                                 
    GRID     86767          8290.   816.722 2007.55
    et voici le résultat que j'obtiens :

    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
     
    GRID    99900000        8290.   1863.13 2003.55                         
    GRID    99900001        8290.   1842.13 2003.55                         
    GRID    99900002        8290.   1821.13 2003.55                         
    GRID    99900003        8290.   1800.13 2003.55                         
    GRID    99900004        8288.   1750.   2003.55
     
    CROD     10000                                 
     
    GRID    99900005        8288.   1726.   2003.55                         
    GRID    99900006        8288.   1689.   2003.55                         
    GRID    99900007        8288.   1665.5  2003.55                         
    GRID    99900008        8288.   1642.   2003.55                         
    GRID    99900009        8288.   1617.9  2003.55                         
    GRID    99900010        8288.   1593.8  2003.55                         
    GRID    99900011        8288.   1569.7  2003.55                         
    GRID    99900012        8288.   1545.6  2003.55                         
    GRID    99900013        8288.   1521.5  2003.55                         
    GRID    99900014        8288.   1498.   2003.55                         
    GRID    99900015        8288.   1474.5  2003.55                         
    GRID    99900016        8288.   1437.5  2003.55                         
    GRID    99900017        8288.   1414.   2003.55                         
    GRID    99900018        8288.   1390.5  2003.55                         
    GRID    99900019        8288.   1369.4  2003.55                         
    GRID    99900020        8288.   1348.3  2003.55                         
    GRID    99900021        8288.   1327.2  2003.55                         
    GRID    99900022        8288.   1306.1  2003.55                         
    GRID    99900023        8288.   1285.   2003.55                         
    GRID    99900024        8288.   1261.5  2003.55                         
    GRID    99900025        8288.   1238.   2003.55                         
    GRID    99900026        8288.   1201.   2003.55                         
    GRID    99900027        8288.   1177.5  2003.55                         
    GRID    99900028        8288.   1154.   2003.55                         
    GRID    99900029        8288.   1131.42 2003.55                         
    GRID    99900030        8288.   1108.83 2003.55                         
    GRID    99900031        8288.   1086.25 2003.55                         
    GRID    99900032        8288.   1063.67 2003.55                         
    GRID    99900033        8288.   1041.08 2003.55                         
    GRID    99900034        8288.   1018.5  2003.55                         
    GRID    99900035        8288.   995.    2003.55                         
    GRID    99900036        8288.   971.5   2003.55                         
    GRID    99900037        8290.   934.5   2003.55                         
    GRID    99900038        8290.   903.017 2005.55                         
    GRID    99900039        8290.   881.443 2005.55                         
    GRID    99900040        8290.   859.869 2006.55                         
    GRID    99900041        8290.   838.295 2006.55                         
    GRID    99900042        8290.   816.722 2007.55
    Comme vous voyez le changement d'ID se passe correctement mais les deux sauts de lignes; aux lignes 7 et 9 me pose problème je ne souhaite pas les avoir et je ne comprend pas pourquoi ils y sont.

    Je souhaite obtenir ceci :

    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
     
    GRID    99900000        8290.   1863.13 2003.55                         
    GRID    99900001        8290.   1842.13 2003.55                         
    GRID    99900002        8290.   1821.13 2003.55                         
    GRID    99900003        8290.   1800.13 2003.55                         
    GRID    99900004        8288.   1750.   2003.55                        
    CROD     10000                                 
    GRID    99900005        8288.   1726.   2003.55                         
    GRID    99900006        8288.   1689.   2003.55                         
    GRID    99900007        8288.   1665.5  2003.55                         
    GRID    99900008        8288.   1642.   2003.55                         
    GRID    99900009        8288.   1617.9  2003.55                         
    GRID    99900010        8288.   1593.8  2003.55                         
    GRID    99900011        8288.   1569.7  2003.55                         
    GRID    99900012        8288.   1545.6  2003.55                         
    GRID    99900013        8288.   1521.5  2003.55                         
    GRID    99900014        8288.   1498.   2003.55                         
    GRID    99900015        8288.   1474.5  2003.55                         
    GRID    99900016        8288.   1437.5  2003.55                         
    GRID    99900017        8288.   1414.   2003.55                         
    GRID    99900018        8288.   1390.5  2003.55                         
    GRID    99900019        8288.   1369.4  2003.55                         
    GRID    99900020        8288.   1348.3  2003.55                         
    GRID    99900021        8288.   1327.2  2003.55                         
    GRID    99900022        8288.   1306.1  2003.55                         
    GRID    99900023        8288.   1285.   2003.55                         
    GRID    99900024        8288.   1261.5  2003.55                         
    GRID    99900025        8288.   1238.   2003.55                         
    GRID    99900026        8288.   1201.   2003.55                         
    GRID    99900027        8288.   1177.5  2003.55                         
    GRID    99900028        8288.   1154.   2003.55                         
    GRID    99900029        8288.   1131.42 2003.55                         
    GRID    99900030        8288.   1108.83 2003.55                         
    GRID    99900031        8288.   1086.25 2003.55                         
    GRID    99900032        8288.   1063.67 2003.55                         
    GRID    99900033        8288.   1041.08 2003.55                         
    GRID    99900034        8288.   1018.5  2003.55                         
    GRID    99900035        8288.   995.    2003.55                         
    GRID    99900036        8288.   971.5   2003.55                         
    GRID    99900037        8290.   934.5   2003.55                         
    GRID    99900038        8290.   903.017 2005.55                         
    GRID    99900039        8290.   881.443 2005.55                         
    GRID    99900040        8290.   859.869 2006.55                         
    GRID    99900041        8290.   838.295 2006.55                         
    GRID    99900042        8290.   816.722 2007.55
    Voici mon 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
    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
     
    ########################################################################################
    """
                                DUPLICATE NODE FOR NASTRAN BULK v1.0
                                         ----------
                                      14 February 2016
    ****************************************************************************************
     
    [+] INPUT :
    - NODE_FILE      : File contains the original GRID card that the user wants duplicate.
     
    [+] OUTPUT :
    - DUPLICATE_NODE : Output file contains the duplicate GRID cards.
     
    [+] VARIBALE :
     
    - FORMAT : Format for the bulk file :
                                       - 8 for small format
                                       - 16 for large format
     
    - N_ID : New ID for the GRID card duplicate. The width of the N_ID can not be larger
           than the FORMAT chose. Must be an integer > 0.
     
    - STEP : Increments the next ID for the duplicate GRID card ID. Must be an integer > 0. 
     
    """
    ########################################################################################
     
    def Duplicate_Node(Bulk_Node, Bulk_Node_Duplicate):
     
        FORMAT = 8
        N_ID   = 99900000
        STEP   = 1
     
        for LINE in Bulk_Node :
     
            if LINE[:8].replace(" ","") == "GRID" :
     
                CARD = LINE[:9].replace(" ", "")
                ID   = LINE[9:16].replace(" ", "")
                CP   = LINE[16:24].replace(" ", "")
                X1   = LINE[24:32].replace(" ", "")
                X2   = LINE[32:40].replace(" ", "")
                X3   = LINE[40:48].replace(" ", "")
                CD   = LINE[48:56].replace(" ", "")
                PS   = LINE[56:64].replace(" ", "")
                SEID = LINE[64:72].replace(" ", "")
     
                CARD = CARD + (FORMAT - len(CARD))* " "
                ID   = ID   + (FORMAT - len(ID))  * " "
                CP   = CP   + (FORMAT - len(CP))  * " "
                X1   = X1   + (FORMAT - len(X1))  * " "
                X2   = X2   + (FORMAT - len(X2))  * " "
                X3   = X3   + (FORMAT - len(X3))  * " "
                CD   = CD   + (FORMAT - len(CD))  * " "
                PS   = PS   + (FORMAT - len(PS))  * " "
                SEID = SEID + (FORMAT - len(SEID))* " "
     
                Bulk_Node_Duplicate.write(CARD + str(N_ID) + CP + X1 + X2 + X3 + CD + PS + SEID + '\n')
     
                N_ID = N_ID + STEP
     
            else :
     
                Bulk_Node_Duplicate.write(LINE + '\n')
     
     
     
    NODE_FILE      = open("MPC_NODE.dat", "r")
    DUPLICATE_NODE = open("duplicate_node.dat", "w")
     
    Duplicate_Node(NODE_FILE,DUPLICATE_NODE)
     
    NODE_FILE.close()
    DUPLICATE_NODE.close()
    Qui peux m'expliquer pourquoi j'ai ces deux sauts de ligne ?

    Merci d'avance pour votre aide

  2. #2
    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
    Citation Envoyé par nekcorp Voir le message
    Qui peux m'expliquer pourquoi j'ai ces deux sauts de ligne ?
    Lorsque vous lisez un fichier avec la construction "for LINE in fichier", çà retourne la ligne *et* la fin de ligne et le .write(LINE + '\n') contiendra 2 fins de lignes. Ceci dit, vous allez trop dans les détails.
    Si la ligne est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> s = 'GRID     86725          8290.   1863.13 2003.55\n'
    pas la peine de faire tous vos "replace":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> s.split()
    ['GRID', '86725', '8290.', '1863.13', '2003.55']
    De plus, si vous voulez afficher une chaîne de x caractères en occupant une longueur fixe de n, vous avez des instructions de formatage for utiles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> '%8s' % '123'
    '     123'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Lorsque vous lisez un fichier avec la construction "for LINE in fichier", çà retourne la ligne *et* la fin de ligne et le .write(LINE + '\n') contiendra 2 fins de lignes. Ceci dit, vous allez trop dans les détails.
    Si la ligne est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> s = 'GRID     86725          8290.   1863.13 2003.55\n'
    pas la peine de faire tous vos "replace":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> s.split()
    ['GRID', '86725', '8290.', '1863.13', '2003.55']
    De plus, si vous voulez afficher une chaîne de x caractères en occupant une longueur fixe de n, vous avez des instructions de formatage for utiles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> '%8s' % '123'
    '     123'
    >>>
    - W
    Merci pour ta réponse.

    En fait pour le formatage je sais qu'il est possible de mieux faire, mais pour l'instant je me concentre sur ce petit soucis que j'ai.
    De plus en utilisant votre méthode je ne pourrais pas faire évoluer mon script par la suite sur une utilisation plus poussée.

    De plus je ne suis pas sur que le "for LINE in fichier renvoie un saut de ligne car sinon j'aurai le problème sur les autres lignes également, pas uniquement sur ce cas particulier. En retirant le '\n' je perd mes sauts de lignes.

  4. #4
    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
    Citation Envoyé par nekcorp Voir le message
    De plus je ne suis pas sur que le "for LINE in fichier renvoie un saut de ligne car sinon j'aurai le problème sur les autres lignes également, pas uniquement sur ce cas particulier. En retirant le '\n' je perd mes sauts de lignes.
    Lancez la console Python et regardez ce que contient une ligne récupérée de cette façon là.

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

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    De plus, si vous voulez afficher une chaîne de x caractères en occupant une longueur fixe de n, vous avez des instructions de formatage for utiles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> '%8s' % '123'
    '     123'
    >>>
    - W
    Alors j'ai essayé d'utiliser le formatage préconisé par wiztricks dites moi ce que vous en pensez et est ce que c'est bien écrit ?

    En fait si j'ai utilisé les formules "bourins" dans mon code de départ c'est parce qu'il faut respecter 8 caractères maximum dans un champ.

    Si vous prenez l'exemple de GRID, à lui tout seul il fait 4 caractères du coup le nombre d'espace que je dois ajouter c'est 4 afin de respecter les 8 caractères max et ainsi pouvoir écrire dans le champ suivant.

    Vous comprenez assez simplement que suivant le champs le nombre d'espace à ajouter est différent du coup je dois les calculer à chaque fois que je veux ré-écrire un champs.

    bon voilà mon code fonctionnel avec la petite touche de wiztricks sur le formatage des chaînes

    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
     
    def Duplicate_Node(Bulk_Node, Bulk_Node_Duplicate):
     
        FORMAT = 8
        N_ID   = 99900000
        STEP   = 1
        i      = 0
     
        for LINE in Bulk_Node :
     
            if LINE[:8] == "GRID" :
     
                LINE = LINE.split()
     
                for FIELD in LINE :
     
                    CARD = '%-(FORMAT-len(LINE[0]))s' % LINE[0]
                    ID   = '%-(FORMAT-len(LINE[1]))s' % LINE[1]
                    CP   = '%-(FORMAT-len(LINE[2]))s' % LINE[2]
                    X1   = '%-(FORMAT-len(LINE[3]))s' % LINE[3]
                    X2   = '%-(FORMAT-len(LINE[4]))s' % LINE[4]
                    X3   = '%-(FORMAT-len(LINE[5]))s' % LINE[5]
                    CD   = '%-(FORMAT-len(LINE[6]))s' % LINE[6]
                    PS   = '%-(FORMAT-len(LINE[7]))s' % LINE[7]
                    SEID = '%-(FORMAT-len(LINE[8]))s' % LINE[8]
     
                    Bulk_Node_Duplicate.write(CARD + str(N_ID) + CP + X1 + X2 + X3 + CD + PS + SEID + '\n')
     
                    N_ID = N_ID + STEP
     
            else :
     
                Bulk_Node_Duplicate.write(LINE)
     
     
     
    NODE_FILE      = open("MPC_NODE.dat", "r")
    DUPLICATE_NODE = open("duplicate_node.dat", "w")
     
    Duplicate_Node(NODE_FILE,DUPLICATE_NODE)
     
    NODE_FILE.close()
    DUPLICATE_NODE.close()

  6. #6
    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
    Citation Envoyé par nekcorp Voir le message
    En fait si j'ai utilisé les formules "bourins" dans mon code de départ c'est parce qu'il faut respecter 8 caractères maximum dans un champ.

    Si vous prenez l'exemple de GRID, à lui tout seul il fait 4 caractères du coup le nombre d'espace que je dois ajouter c'est 4 afin de respecter les 8 caractères max et ainsi pouvoir écrire dans le champ suivant.
    Si une ligne commençant par GRID est composée de 9 éléments de longueur fixée à 8, .split va dégager les champs non renseignés (là ou il n'y a que des espaces) et ne verra pas les champs accolés (ceux qui ne sont pas séparés par 1 espace).
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> line
    'GRID     86725          8290.   1863.13 2003.55                                 \n'
    Avec .split, on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> line.split()
    ['GRID', '86725', '8290.', '1863.13', '2003.55']
    >>>
    et on perd le 3ème élément...
    Si on doit découper la ligne par paquets de 8:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [ line[x: x+8].strip() for x in range(0, len(line[:-1]), 8) ]
    ['GRID', '86725', '', '8290.', '1863.13', '2003.55', '', '', '', '']
    Pour le cas ou la line est "incomplète":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> line = 'GRID     86729          8288.   1750.   2003.55'
    >>> items = [ line[x: x+8].strip() for x in range(0, len(line[:-1]), 8) ]
    >>> items
    ['GRID', '86729', '', '8288.', '1750.', '2003.55']
    On peut ajouter les éléments à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> VARCOUNT = 10
    >>> items += [ '' ] * (VARCOUNT- len(items))
    >>> items
    ['GRID', '86729', '', '8288.', '1750.', '2003.55', '', '', '', '']
    Et on peut remettre tout çà en forme avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> ''.join(FORMAT % s for s in items)
    'GRID    86729           8288.   1750.   2003.55                                 '
    >>>
    Reste à comprendre l'intérêt de la manip. puisqu'ici on découpe et on réassemble à l'identique.
    Enfin presque car on ajoute des 'espaces' aux lignes trop courtes, mais çà pourrait être fait plus simplement.

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

  7. #7
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si une ligne commençant par GRID est composée de 9 éléments de longueur fixée à 8, .split va dégager les champs non renseignés (là ou il n'y a que des espaces) et ne verra pas les champs accolés (ceux qui ne sont pas séparés par 1 espace).
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> line
    'GRID     86725          8290.   1863.13 2003.55                                 \n'
    Avec .split, on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> line.split()
    ['GRID', '86725', '8290.', '1863.13', '2003.55']
    >>>
    et on perd le 3ème élément...
    Si on doit découper la ligne par paquets de 8:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [ line[x: x+8].strip() for x in range(0, len(line[:-1]), 8) ]
    ['GRID', '86725', '', '8290.', '1863.13', '2003.55', '', '', '', '']
    Pour le cas ou la line est "incomplète":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> line = 'GRID     86729          8288.   1750.   2003.55'
    >>> items = [ line[x: x+8].strip() for x in range(0, len(line[:-1]), 8) ]
    >>> items
    ['GRID', '86729', '', '8288.', '1750.', '2003.55']
    On peut ajouter les éléments à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> VARCOUNT = 10
    >>> items += [ '' ] * (VARCOUNT- len(items))
    >>> items
    ['GRID', '86729', '', '8288.', '1750.', '2003.55', '', '', '', '']
    Et on peut remettre tout çà en forme avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> ''.join(FORMAT % s for s in items)
    'GRID    86729           8288.   1750.   2003.55                                 '
    >>>
    Reste à comprendre l'intérêt de la manip. puisqu'ici on découpe et on réassemble à l'identique.
    Enfin presque car on ajoute des 'espaces' aux lignes trop courtes, mais çà pourrait être fait plus simplement.

    - W
    Merci wiztricks pour cet élément de réponse.

    J'ai pas encore testé tes recommandations mais pour répondre à ton interrogation

    Reste à comprendre l'intérêt de la manip. puisqu'ici on découpe et on réassemble à l'identique.
    En fait si tu te rappel au début j'expliquais que je devais renuméroter mes cartes GRID en modifiant le 2ème champs et mon soucis c'était que lorsque je ré-écrivais le fichier avec les cartes renumérotés, j'avais des sauts de lignes qui apparaissaient mais que je ne comprenais pas pourquoi.

    De plus le fait de comprendre comment manipuler ce genre de fichier cela me permettra par la suite de mettre en place des outils car cet exemple est très simple, j'ai des projets de scripts plus ambitieux pour la suite.

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Mais merci pour tes remarques certaines choses m'avaient échappées.
    de mémoire c'est du côté des pages 1050 et quelques

    Citation Envoyé par nekcorp Voir le message
    En fait si tu te rappel au début j'expliquais que je devais renuméroter mes cartes GRID en modifiant le 2ème champs et mon soucis c'était que lorsque je ré-écrivais le fichier avec les cartes renumérotés, j'avais des sauts de lignes qui apparaissaient mais que je ne comprenais pas pourquoi.
    on est d'accord pour dire en l'occurrence que la ligne 5 du fichier n'était pas valide (48 caractères au lieu de 81 normalement) et par extension la ligne 6 (celle commençant par CROD) également ?
    si c'est l'application qui tronque les lignes ainsi c'est soucieux à mon avis, puisque ça ne respecterait pas le format décrit dans leurs propres spécifications

  9. #9
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu ne dois pas rajouter de saut de ligne à cette ligne là il y est déjà.

    D'autre part ton code est infiniment trop compliqué pour ce que tu as à faire.

    Regarde ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> l = "GRID     86745          8288.   1348.3  2003.55 "
    >>> items = ['%-8s' % i for i in l.split(' ') if i]
    >>> items
    ['GRID    ', '86745   ', '8288.   ', '1348.3  ', '2003.55 ']
    >>> items[1] = N_ID  # Changer l'ID
    >>> line = ''.join(items) + '\n'   # Recréer la ligne

  10. #10
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Tu ne dois pas rajouter de saut de ligne à cette ligne là il y est déjà.

    D'autre part ton code est infiniment trop compliqué pour ce que tu as à faire.

    Regarde ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> l = "GRID     86745          8288.   1348.3  2003.55 "
    >>> items = ['%-8s' % i for i in l.split(' ') if i]
    >>> items
    ['GRID    ', '86745   ', '8288.   ', '1348.3  ', '2003.55 ']
    >>> items[1] = N_ID  # Changer l'ID
    >>> line = ''.join(items) + '\n'   # Recréer la ligne
    Salut, merci pour ta réponse.

    Mais comme dit plus haut je ne cherche pas vraiment à optimiser le code dans l'immédiat je cherche juste à ne pas avoir ces sauts de lignes. Je ne comprend pas de quel saut de ligne tu parles ?

  11. #11
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Salut, merci pour ta réponse.

    Mais comme dit plus haut je ne cherche pas vraiment à optimiser le code dans l'immédiat je cherche juste à ne pas avoir ces sauts de lignes. Je ne comprend pas de quel saut de ligne tu parles ?
    Dans la console le résultat est le même. Je ne comprend où j'ai mis un saut de ligne de trop. J'ai testé en les retirant et un les inversant ça ne résoud pas mon problème.

    Lorsque je ne met pas de '\n' je n'ai aucun saut de ligne mais lorsque que je le met j'en ai deux pour le cas précisé plus haut.

    Help me please

  12. #12
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Comme on te l'a expliqué précédemment, lorsque tu recrées ta ligne il est normal d'ajouter le retour.

    Ceci est OK:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Bulk_Node_Duplicate.write(CARD + str(N_ID) + CP + X1 + X2 + X3 + CD + PS + SEID + '\n')
    mais lorsque tu réécris la même ligne, le retour ligne y est déjà. Tu ne dois pas en rajouter un.
    Donc juste ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Bulk_Node_Duplicate.write(LINE)

  13. #13
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Une question hors sujet au passage : comment fais-tu pour récupérer des fichiers grib sous forme de données ? Ce sont des fichiers .txt, .dat ?
    Si tu as un site ou télécharger cela, je suis intéressé. De mon côté, je n'ai que des fichiers .grb ou .bz2.

  14. #14
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Comme on te l'a expliqué précédemment, lorsque tu recrées ta ligne il est normal d'ajouter le retour.

    Ceci est OK:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Bulk_Node_Duplicate.write(CARD + str(N_ID) + CP + X1 + X2 + X3 + CD + PS + SEID + '\n')
    mais lorsque tu réécris la même ligne, le retour ligne y est déjà. Tu ne dois pas en rajouter un.
    Donc juste ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Bulk_Node_Duplicate.write(LINE)
    Merci VinsS pour ta réponse.

    Cependant le résultat que je souhaite ne colle toujours pas. Je n'ai plus le saut de ligne juste après mais je l'ai toujours juste avant.

    Au final j'obtient ceci :

    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
     
    GRID    99900000        8290.   1863.13 2003.55                         
    GRID    99900001        8290.   1842.13 2003.55                         
    GRID    99900002        8290.   1821.13 2003.55                         
    GRID    99900003        8290.   1800.13 2003.55                         
    GRID    99900004        8288.   1750.   2003.55
     
    CROD     10000                                 
    GRID    99900005        8288.   1726.   2003.55                         
    GRID    99900006        8288.   1689.   2003.55                         
    GRID    99900007        8288.   1665.5  2003.55                         
    GRID    99900008        8288.   1642.   2003.55                         
    GRID    99900009        8288.   1617.9  2003.55                         
    GRID    99900010        8288.   1593.8  2003.55                         
    GRID    99900011        8288.   1569.7  2003.55
    Il faudrait que le saut de ligne à la ligne 7 ne se fasse pas.

    au final je souhaite ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    GRID    99900000        8290.   1863.13 2003.55                         
    GRID    99900001        8290.   1842.13 2003.55                         
    GRID    99900002        8290.   1821.13 2003.55                         
    GRID    99900003        8290.   1800.13 2003.55                         
    GRID    99900004        8288.   1750.   2003.55                        
    CROD     10000                                 
    GRID    99900005        8288.   1726.   2003.55                         
    GRID    99900006        8288.   1689.   2003.55                         
    GRID    99900007        8288.   1665.5  2003.55                         
    GRID    99900008        8288.   1642.   2003.55                         
    GRID    99900009        8288.   1617.9  2003.55                         
    GRID    99900010        8288.   1593.8  2003.55                         
    GRID    99900011        8288.   1569.7  2003.55

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

Discussions similaires

  1. Problème saut de ligne dans mes champs
    Par xess91 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/05/2010, 16h59
  2. Problème saut de lignes !
    Par lami_dta_femme dans le forum Mise en page CSS
    Réponses: 17
    Dernier message: 30/04/2008, 00h05
  3. [VBA] Import Excel: problème saut de ligne
    Par davasm dans le forum Général VBA
    Réponses: 2
    Dernier message: 30/11/2007, 09h05
  4. [Tableaux] Problème saut de ligne
    Par @lexx dans le forum Langage
    Réponses: 14
    Dernier message: 26/03/2006, 15h20
  5. Problème saut de ligne dans un tableau
    Par talggir dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/11/2005, 15h10

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