[Python] Copier certains éléments d'une liste

grandu -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

j'ai une grille de points X, Y, Z comme suit comportant beaucoup d'enregistrement :
652,300,100
653,321,102
654,326,101
658,324,106
...
J'aimerai extraire une zone précise, par exemple créer un fichier dont seuls les points avec les coordonnées x entre 651 et 655 et y entre 321 et 325 apparaissent, sachant que les points ne sont pas dans un ordre précis. J'ai essayé en python mais étant débutant c'est pas facile. Le fichier est trop gros pour excel et équivalent.

Merci

2 réponses

  1. numero 6
     
    Bonsoir

    Excel peut suppoter 65636 lignes, dans certains cas ça peut etre insuffisant.
    Mais avec une petite macro, on peut eviter de charger un long fichier structuré comme le tien.
    Ce petit programme tout bete lit le fichier source ligne par ligne, si les coodonnées (X,Y) sont dans l'intervalle voulu, la ligne est transférée dans le fichier destination.
    Colle cette macro dans un module excel, adapte les noms de fichiers et les Mini Maxi, et execute.
    Essaye dabord sur un petit fichier exemple.
    Si le fichier est vraiment tres long, l'execution peut demander plusieurs dizaines de secondes.

    Sub Extraction()
    Dim FichierSource As String, FichierDestination As String
    Dim X As Integer, Y As Integer, Z As Integer
    Dim XMini As Integer, XMaxi As Integer, YMini As Integer, YMaxi As Integer
    
    FichierSource = "F:\f1.txt"
    FichierDestination = "F:\f2.txt"
    XMini = 234: YMini = 459
    XMaxi = 243: YMaxi = 468
    
    Close
    Open FichierSource For Input As #1
    Open FichierDestination For Output As #2
    
    While Not EOF(1)
    Input #1, X, Y, Z
    If (X >= XMini And X <= XMaxi) And (Y >= YMini And Y <= YMaxi) Then
    Write #2, X, Y, Z
    End If
    Wend
    Close
    MsgBox "Extraction terminée"
    
    End Sub
    0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,
    En python, cela donnerait simplement :
    #A represente ta liste 
    A=[(652,300,100),(653,321,102),(654,326,101),(658,324,106)] 
    #B represente l'extraction 
    B=[(x,y,z) for x,y,z in A if x in range(651,655) and y in range(321,325)] 
    print B 
    

    Cdlt,

    Google is your friend
    0