2 votes

filtrage de certaines lignes

J'ai un fichier texte (a.txt) dont voici une petite partie :

ENSG00000060642.6   0,023999998 0,015999999 0,666666667 0,006410256 0,006410256 1,000000073 0,016393442 0,016393442 1   0,020202022 0,030303031 1,499999908
ENSG00000149136.3   0,03508772  0,01754386  0,5 0,068627447 0,029411765 0,428571456 0,078947365 0,065789476 0,833333396 0,066666663 0,066666663 1
ENSG00000104889.4   0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0!
ENSG00000157827.15  0,055555556 0,037037037 0,666666667 0,032258064 0,048387095 1,5 0,150000006 0,024999999 0,16666665  0,222222224 0,037037037 0,166666667
ENSG00000146067.11  0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0!
ENSG00000167700.4   0,299999982 0   0   0,071428567 0,071428567 1   0   0   #DIV/0! 0   0   #DIV/0!
ENSG00000172137.14  0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 1   0   0
ENSG00000178776.4   0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0!

Je veux filtrer toutes les lignes contenant "#DIV/0 !", même s'il n'y a qu'un seul "#DIV/0 !", et créer un nouveau fichier texte.

1voto

Owl Max Points 2251
with open('a.txt') as f, open('b.txt', 'w') as new_file:
    new_file.writelines([line for line in f if '#DIV/0!' not in line])

Editer :

Cette méthode est probablement la plus rapide. Mais comme discuté avec @martineau plus tôt, il se peut qu'elle ne soit pas la meilleure solution en fonction de la taille de votre fichier.

  • list comprehension [line for line in f if '#DIV/0!' not in line] est très courant en python, il remplace le morceau de code :

    l = []
    for line in f:
        if '#DIV/0!' not in line:
            l.append(line)

mais il est plus optimisé (voir ici pour une explication) : Efficacité des compréhensions de listes )

list comprehension charge tout en mémoire et peut donc peut donc provoquer un débordement de la mémoire tampon en cas de grande quantité de données.

C'est pourquoi ici, l'utilisation d'une méthode incrémentale (celle de @martineau) est plus sûre lorsque l'on n'est pas sûr du nombre de données que l'on va traiter !

  • En with remplace un try and catch. Elle permet également de automatiquement le fichier après le bloc. Comme vous pouvez le voir, il peut également être imbriqué : vous pouvez ouvrir plusieurs fichiers avec un seul bloc. comme vous pouvez le voir, il peut également être imbriqué : vous pouvez ouvrir plusieurs fichiers avec un seul bloc. with déclaration.

1voto

martineau Points 21665

Vous pouvez procéder de la manière suivante, qui est incrémentale (elle ne lit pas tout le fichier en mémoire en une seule fois) :

from itertools import ifilter

with open('a.txt', 'r') as inf, open('new.txt', 'w') as outf:
    outf.writelines(ifilter(lambda line: '#DIV/0!' not in line, inf))

0voto

Szabolcs Dombi Points 2570
for line in open('a.txt').read().splitlines():
    if '#DIV/0!' not in line:
        print(line)

0voto

cedzz Points 312
new_file = open('output.txt' , 'w') 
for line in open('a.txt').read().splitlines():
     if '#DIV/0!' not in line: 
           new_file.write(line)
new_file.close()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X