Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/12/2015, à 11:31

skander09

filtrage par python

Bonjour,

je veux une modification sur mon programme de tel sorte que le fichier sorti soit complet, parce que à certain moment il n' arrive à compléter !
Aussi, je veux que cette ligne, qui n' a pas de valeurs associés, dans le fichier sortie ne sera pas éliminé

def filtrage(f_obj, ligne_txt):
    for ligne in f_obj:
        if ligne_txt.split() == ligne.split()[:2]:
            return ligne
    else:
        return ligne_txt
 
def ecriture(donnees, filtre, sortie):
    with open(donnees, "r") as f_donnees, open(filtre, "r") as f_filtre, \
                                                  open(sortie, "w") as f_sortie:
        for ligne in f_filtre:
            data = filtrage(f_donnees, ligne)
            f_sortie.write(data)
 
ecriture("A.txt", "B.txt", "C.txt")

et les fichiers A.txt :

  0      4    1.378512E-08    9.200755E+01
  0      6    3.378335E-01    2.348521E+09
  0      8    7.176137E-09    5.495386E+01
  0     16    8.494603E-02    6.580827E+08
  0     18    8.443604E-10    6.833470E+00
  0     22    3.395447E-02    2.761077E+08
  0     33    6.640701E-11    5.531737E-01
  0     36    1.697880E-02    1.417743E+08
  0     51    6.274462E-11    5.307665E-01
  0     54    9.696413E-03    8.213653E+07
  0     73    1.265234E-10    1.080120E+00
  0     76    6.056082E-03    5.174486E+07
  0    100    2.047628E-10    1.758387E+00
  0    118    4.034826E-03    3.466874E+07
  0    130    2.951019E-10    2.544361E+00
  0    156    2.822787E-03    2.434780E+07
  0    192    3.503975E-10    3.029646E+00
  0    194    2.051889E-03    1.774648E+07
  1      3    1.441813E+00    3.042966E+07
  1      4    8.651961E-01    3.044227E+07
  1      5    2.884343E-01    3.045412E+07
  1      8    1.125125E-01    1.551758E+07
  1      9    3.750709E-02    1.551893E+07
  1     10    1.874947E-01    1.551570E+07
  1     18    3.916832E-02    7.893649E+06
  1     19    6.527351E-02    7.892804E+06
  1     20    1.305685E-02    7.894142E+06
  1     32    3.063817E-02    4.418643E+06
  1     33    1.838465E-02    4.419069E+06
  1     34    6.128516E-03    4.419301E+06
  1     50    1.688199E-02    2.661043E+06
  1     51    1.013008E-02    2.661278E+06
  1     52    3.376842E-03    2.661396E+06
  1     72    1.031562E-02    1.711732E+06
  1     73    6.189889E-03    1.711876E+06
  1     74    2.063383E-03    1.711949E+06
  1     99    6.775319E-03    1.161479E+06
  1    100    4.065520E-03    1.161574E+06
  1    101    1.355228E-03    1.161621E+06
  1    129    4.693675E-03    8.224504E+05
  1    130    2.816427E-03    8.225162E+05
  1    131    9.388463E-04    8.225492E+05
  1    191    3.387589E-03    6.027246E+05
  1    192    2.032711E-03    6.027720E+05
  1    193    6.775968E-04    6.027958E+05

et le fichier B.txt :

  0      4
  0      6
  0     16
  0     22
  0     36
  0     54
  0     76
  0    118
  0    156
  0    194
  1      3
  1      4
  1      5
  1      6
  1     10
  1      8
  1      9
  1     19
  1     18
  1     20
  1     32
  1     33
  1     34
  1     50
  1     51
  1     52
  1     72
  1     73
  1     74
  1     99
  1    100
  1    101
  1    129
  1    130
  1    131
  1    191
  1    192
  1    193

j' ai trouvé comme sortie C.txt :

  0      4    1.378512E-08    9.200755E+01
  0      6    3.378335E-01    2.348521E+09
  0     16    8.494603E-02    6.580827E+08
  0     22    3.395447E-02    2.761077E+08
  0     36    1.697880E-02    1.417743E+08
  0     54    9.696413E-03    8.213653E+07
  0     76    6.056082E-03    5.174486E+07
  0    118    4.034826E-03    3.466874E+07
  0    156    2.822787E-03    2.434780E+07
  0    194    2.051889E-03    1.774648E+07
  1      3    1.441813E+00    3.042966E+07
  1      4    8.651961E-01    3.044227E+07
  1      5    2.884343E-01    3.045412E+07
  1      6
  1     10
  1      8
  1      9
  1     19
  1     18
  1     20
  1     32
  1     33
  1     34
  1     50
  1     51
  1     52
  1     72
  1     73
  1     74
  1     99
  1    100
  1    101
  1    129
  1    130
  1    131
  1    191
  1    192
  1    193

qui n' est pas complète !!!

et Merci d' avance smile

Hors ligne

#2 Le 21/12/2015, à 11:47

pingouinux

Re : filtrage par python

Bonjour,
C'est parce que, dans ecriture, tu fais une boucle sur les lignes de B.txt. Tu ne traites donc que ces lignes.

Édité :
Essaye ceci

def tri(x):
   s=x[:10].split()
   return int(s[0]),int(s[1])

def ecriture(donnees, filtre, sortie):
    with open(donnees, "r") as f_donnees, open(filtre, "r") as f_filtre, \
         open(sortie, "w") as f_sortie:
        ligs_don=f_donnees.readlines()
        ligs_fil=f_filtre.readlines()
        ligs_tot=sorted(ligs_don+ligs_fil,key=tri)
        lig_avant=''
        for lig in ligs_tot:
            if lig[:10]==lig_avant[:10]: continue
            else: lig_avant=lig
            f_sortie.write(lig)

ecriture("A.txt", "B.txt", "C.txt")

qui donne ce résultat

  0      4    1.378512E-08    9.200755E+01
  0      6    3.378335E-01    2.348521E+09
  0      8    7.176137E-09    5.495386E+01
  0     16    8.494603E-02    6.580827E+08
  0     18    8.443604E-10    6.833470E+00
  0     22    3.395447E-02    2.761077E+08
  0     33    6.640701E-11    5.531737E-01
  0     36    1.697880E-02    1.417743E+08
  0     51    6.274462E-11    5.307665E-01
  0     54    9.696413E-03    8.213653E+07
  0     73    1.265234E-10    1.080120E+00
  0     76    6.056082E-03    5.174486E+07
  0    100    2.047628E-10    1.758387E+00
  0    118    4.034826E-03    3.466874E+07
  0    130    2.951019E-10    2.544361E+00
  0    156    2.822787E-03    2.434780E+07
  0    192    3.503975E-10    3.029646E+00
  0    194    2.051889E-03    1.774648E+07
  1      3    1.441813E+00    3.042966E+07
  1      4    8.651961E-01    3.044227E+07
  1      5    2.884343E-01    3.045412E+07
  1      6
  1      8    1.125125E-01    1.551758E+07
  1      9    3.750709E-02    1.551893E+07
  1     10    1.874947E-01    1.551570E+07
  1     18    3.916832E-02    7.893649E+06
  1     19    6.527351E-02    7.892804E+06
  1     20    1.305685E-02    7.894142E+06
  1     32    3.063817E-02    4.418643E+06
  1     33    1.838465E-02    4.419069E+06
  1     34    6.128516E-03    4.419301E+06
  1     50    1.688199E-02    2.661043E+06
  1     51    1.013008E-02    2.661278E+06
  1     52    3.376842E-03    2.661396E+06
  1     72    1.031562E-02    1.711732E+06
  1     73    6.189889E-03    1.711876E+06
  1     74    2.063383E-03    1.711949E+06
  1     99    6.775319E-03    1.161479E+06
  1    100    4.065520E-03    1.161574E+06
  1    101    1.355228E-03    1.161621E+06
  1    129    4.693675E-03    8.224504E+05
  1    130    2.816427E-03    8.225162E+05
  1    131    9.388463E-04    8.225492E+05
  1    191    3.387589E-03    6.027246E+05
  1    192    2.032711E-03    6.027720E+05
  1    193    6.775968E-04    6.027958E+05

Dernière modification par pingouinux (Le 21/12/2015, à 12:28)

Hors ligne

#3 Le 21/12/2015, à 12:48

skander09

Re : filtrage par python

Mais pourquoi que j' ai comme sortie comme ça ! il y' a des lignes qui se répètent !

  
 0	  4	1.378512E-08	9.200755E+01
  0	  4
  0	  6	3.378335E-01	2.348521E+09
  0	  6
  0	  8	7.176137E-09	5.495386E+01
  0	 16	8.494603E-02	6.580827E+08
  0	 16
  0	 18	8.443604E-10	6.833470E+00
  0	 22	3.395447E-02	2.761077E+08
  0	 22
  0	 33	6.640701E-11	5.531737E-01
  0	 36	1.697880E-02	1.417743E+08
  0	 36
  0	 51	6.274462E-11	5.307665E-01
  0	 54	9.696413E-03	8.213653E+07
  0	 54
  0	 73	1.265234E-10	1.080120E+00
  0	 76	6.056082E-03	5.174486E+07
  0	 76
  0	100	2.047628E-10	1.758387E+00
  ......

Hors ligne

#4 Le 21/12/2015, à 13:12

pingouinux

Re : filtrage par python

Peux-tu faire un copier-coller du script python tel que tu l'as lancé ? Chez moi, il marche parfaitement avec les données du #1.

N'y a-t-il pas une erreur sur cette ligne ?

            else: lig_avant=lig

Dernière modification par pingouinux (Le 21/12/2015, à 13:15)

Hors ligne

#5 Le 21/12/2015, à 15:02

skander09

Re : filtrage par python

Merci pour votre aide, enfin j' ai obtenu votre résultat !

Mais votre sortie n' est encore c'est ce que je veux, je veux encore une modification !!
En fête, je veux que juste les lignes du fichier B

Dernière modification par skander09 (Le 21/12/2015, à 15:19)

Hors ligne

#6 Le 21/12/2015, à 18:47

pingouinux

Re : filtrage par python

Si python n'est pas obligatoire :

#!/bin/bash
while IFS='\n' read lig
do
   grep "^$lig" A.txt || echo "$lig"
done <B.txt >C.txt

Ajouté : Et en python

def ecriture(donnees, filtre, sortie):
    with open(donnees, "r") as f_donnees, open(filtre, "r") as f_filtre, \
         open(sortie, "w") as f_sortie:
        ligs_don=f_donnees.readlines()
        ligs_don_deb=tuple(map(lambda x:x[:10]+'\n',ligs_don))
        for lig in f_filtre:
            try: k=ligs_don_deb.index(lig); ligne=ligs_don[k]
            except ValueError: ligne=lig
            f_sortie.write(ligne)
 
ecriture("A.txt", "B.txt", "C2.txt")

Ajouté (2) : En fait, il manquait peu de choses dans ton script initial pour qu'il marche

def filtrage(f_obj, ligne_txt):
    for ligne in f_obj:
        if ligne_txt.split() == ligne.split()[:2]:
            return ligne
    return ligne_txt

def ecriture(donnees, filtre, sortie):
    with open(donnees, "r") as f_donnees, open(filtre, "r") as f_filtre, \
         open(sortie, "w") as f_sortie:
        f_donnees=f_donnees.readlines()
        for ligne in f_filtre:
            data = filtrage(f_donnees, ligne)
            f_sortie.write(data)

ecriture("A.txt", "B.txt", "C.txt")

Dernière modification par pingouinux (Le 21/12/2015, à 20:42)

Hors ligne

#7 Le 21/12/2015, à 21:44

skander09

Re : filtrage par python

Merci beaucoup pour votre aide précieuse smile

Hors ligne

#8 Le 22/12/2015, à 06:22

pingouinux

Re : filtrage par python

Explication sur le résultat que tu obtiens avec ton script en #1
Quand tu fais plusieurs lectures successives sur un flux (ici f_donnees), chacune commence là où la précédente s'était arrêtée. Tu ne fais donc pas une boucle sur tout le fichier A.txt à chaque appel de filtrage,
Quand tu tombes sur un élément de B.txt qui ne figure pas dans A.txt (ici   1      6), tu vas lire tout le fichier A.txt avant de t'apercevoir qu'il n'y est pas, et tu te retrouves en fin de fichier.
Tu ne trouves donc plus aucun des éléments de B.txt qui suivent   1      6.

Hors ligne

#9 Le 22/12/2015, à 16:57

skander09

Re : filtrage par python

D' accord j'ai compris, merci encore une fois smile

Encore cette méthode qui me parait une nouveauté pour moi, veuillez me l'expliquer et grand Merci pour vous !!

#!/bin/bash
while IFS='\n' read lig
do
   grep "^$lig" A.txt || echo "$lig"
done <B.txt >C.txt

Hors ligne

#10 Le 22/12/2015, à 17:42

pingouinux

Re : filtrage par python

#!/bin/bash
while IFS='\n' read lig              # Boucle de lecture de B.txt, ligne par ligne (y compris les espaces)
do
   grep "^$lig" A.txt || echo "$lig" # Si on trouve cette ligne au début d'une ligne de A.txt, grep sort la ligne de A.txt. Sinon, on sort la ligne de B.txt
done <B.txt >C.txt                   # Lecture sur B.txt, écriture sur C.txt

Hors ligne