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 :

extraction d'une chaine de caractères d'une liste


Sujet :

Python

  1. #1
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut extraction d'une chaine de caractères d'une liste
    Bonjour,

    je crée un petit programme qui doit m'aider à traire plusieurs centaines de fichiers textes de résultats. Il me reste une dernière manipulation. J'ai cette donnée :
    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
    [['0111HI_K949.txt']
     ['0207AN_K949.txt']
     ['0406MA_K949.txt']
     ['0412DA_K949.txt']
     ['0412JA_K949.txt']
     ['0502AN_K949.txt']
     ['0608LA_K949.txt']
     ['0911EL_K949.txt']
     ['1109RO_K949.txt']
     ['1306AU_K949.txt']
     ['1306RE_K949.txt']
     ['1404MA_K949.txt']
     ['1407NA_K949.txt']
     ['1412MA_K949.txt']
     ['1603FR_K949.txt']
     ['1610CA_K949.txt']
     ['1710MA_K949.txt']
     ['1803CH_K949.txt']
     ['1805PA_K949.txt']
     ['1810VI_K949.txt']
     ['1811EL_K949.txt']
     ['1912HE_K949.txt']
     ['2002MO_K949.txt']
     ['2102BA_K949.txt']
     ['2105MA_K949.txt']
     ['2107HE_K949.txt']
     ['2208AM_K949.txt']
     ['2305DO_K949.txt']
     ['2312MA_K949.txt']
     ['2409IN_K949.txt']
     ['2504PI_K949.txt']
     ['2506AN_K949.txt']
     ['2604AN_K949.txt']
     ['2607AN_K949.txt']
     ['2608SI_K949.txt']
     ['2805JA_K949.txt']
     ['2806CH_K949.txt']
     ['3012CA_K949.txt']
     ['3112UR_K949.txt']]
    donc une liste de dimension 39(dimension variable) par 1 et je voudrais avoir une liste de dimension 39(dimension variable) par 2 du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [['0111HI' 'K949']
     ['0207AN' 'K949']
     ['0406MA' 'K949']
     ...
     ['3012CA' 'K949']
     ['3112UR' 'K949']]
    auriez-vous une idée ?

    le but est que cette liste remplace 'T1,T2' lors de la concaténation
    merci par avance


    pour info le petit programme (qui m'a pris 12h pour le moment, je sais je suis un boulet mais je commence python depuis aujourd'hui) :
    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
    import os
    import glob
    import numpy as np
    S=os.listdir('C:/Users/gaetan.palka/Desktop/Kit_K949')
    A=glob.glob('C:/Users/gaetan.palka/Desktop/Kit_K949/*K*.txt')
    D=np.zeros((len(A),2))
    E=np.zeros((len(A),1))
    G=np.transpose(A)
    T1=np.reshape(S,(len(S),1))
    T2=np.reshape(S,(len(S),1))
    #x=
    for i in range(len(A)):
        B=np.loadtxt(A[i])
        C=np.zeros((len(B),2))
        for j in range(len(B)):
            C[j,0]=B[j,1]*B[j,4]
            C[j,1]=B[j,2]*B[j,4]
            D[i]=np.mean(C,0)
            E[i]=np.std(C)
    F=np.concatenate((T1,T2,D,E),axis=1)
    print(F)

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 36
    Points
    36
    Par défaut
    Je ne connais rien à numpy, ce que vous demandez c'est une liste qui contient d'autres liste de deux éléments ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    All=[]
    list=[]
     
    list.append('1811EL')
    list.append('K949.txt')
    All.append(list)
    http://docs.python.org/tutorial/datastructures.html

  3. #3
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Il s’agit simplement d’un petit split() sur le '_', non ? Quelque chose comme ça*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [el[0].split('_') for el in lst]  # lst being the org list [['0111HI_K949.txt'], ['0207AN_K949.txt'], ...]
    Ou encore, en mode “développé”*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    res_lst = []
    for el in lst:
        res_lst.append(el[0].split('_'))

  4. #4
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    merci pour vos réponses. J'ai un peu de mal avec append car j'ai lu beaucoup de choses différentes et parfois contradictoire (mais je pense que c'est moi qui n'ai pas compris)

    La méthode de mont29 fonctionne bien. Je n'ai plus qu'à trouver comment enlever le '.txt'.
    Mais je ne comprends pas le [0]. Ce serait : pour chaque element el de la liste lst situé en première colonne on met dans res_lst la partie avant '_' dans la première colonne et la partie après '_' dans la deuxième colonne ?

  5. #5
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Ben oui, [0], because l’itération sur la liste principale renvoie des sous-listes (d’un seul élément, à chaque fois), s’pas*?

    Pour virer le .txt, le plus simple est d’enlever les 4 derniers caractères*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [el[0][:-4].split('_') for el in lst]
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    res_lst = []
    for el in lst:
        res_lst.append(el[0][:-4].split('_'))

  6. #6
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Merci pour l'aide. J'avais tenté :
    res_lst = []
    for el in lst:
    res_lst.append(el[0][:-4].split('_'))
    res_lst=res_lst[:-4]
    mais le résultat n'était pas concluant.

    Une dernière question : je n'arrive pas à écrire ma dernière liste produite dans un fichier *.txt sans détruire le format. J'utilise la fonction write mais tout est en ligne, je perds les colonnes.

    PS : je sais je suis un boulet et il faut que je poursuive la lecture du "swinnen"

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    PS : je sais je suis un boulet et il faut que je poursuive la lecture du "swinnen"
    C'est pas faux (Pour la lecture de swinnen, je précise)

    Quand tu utilises ta méthode write

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier.write(line+'\n') # le \n représente le caractère de fin de ligne
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Citation Envoyé par Supernul Voir le message
    res_lst = []
    for el in lst:
    res_lst.append(el[0][:-4].split('_'))
    res_lst=res_lst[:-4]
    Mais pourquoi donc diantre diable fichtre et foutre cette dernière ligne*? Les trois premières suffisent amplement, la dernière ne fait que tronquer ta liste de résultats aux quatre premiers*!

    Et utilises les balises [code] (le #, dans la barre d’outils), outre la coloration syntaxique elle a aussi l’avantage de préserver l’indentation, ce qui n’est pas totalement inutile en Python…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    res_lst = []
    for el in lst:
        res_lst.append(el[0][:-4].split('_'))
    PS*: Pour l’écriture, comme le dit fred, c’est à toi de définir les lignes… Quelque chose comme*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for l in res_lst:
        f.write(' '.join(l) + '\n')
    Ou, encore mieux (mais plus “avancé”)*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write('\n'.join(' '.join(l) for l in res_lst))

  9. #9
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Je vous remercie de vos réponses ... avec beaucoup de retard

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    En évitant la liste intermédiaire qui sert actuellement juste de "passe plat":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    target = 'output.txt'
    with open(target, 'w') as f:
        for el in lst:
            parsed = el[0][:-4].split('_')
            f.write(' '.join(parsed) + '\n')
    Et on utilise le moyen le plus propre pour manipuler un fichier : l'usage de with open(...) as f assure que quoi qu'il se passe dans la boucle for le fichier sera refermé

  11. #11
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Hehe, oui, on peut même faire encore plus compact (et éviter plusieurs appels à write, ainsi qu’une variable intermédiaire)*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    target = 'output.txt'
    with open(target, 'w') as f:
        f.write('\n'.join(' '.join(el[0][:-4].split('_')) for el in lst))
    Mais là, je sens que PauseKawa va râler…

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

Discussions similaires

  1. [Batch] extraction caractère d'une chaine de caractère dans un fichier texte
    Par Zoïïc dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 24/06/2014, 19h20
  2. [WD17] Extraction d'une chaine de caractère d'une page internet
    Par DavidArwen dans le forum WinDev
    Réponses: 28
    Dernier message: 27/03/2013, 17h29
  3. Réponses: 5
    Dernier message: 02/01/2006, 22h16
  4. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 11h51
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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