Pages : 1
#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
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
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
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
Pages : 1