2016-08-09 17 views
2

Ich habe eine Textdatei (a.txt). hier ein kleiner Teil davon:Ausfiltern einiger Zeilen

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! 

Ich möchte alle Zeilen einschließlich heraus filtern, auch wenn es nur eine ist, und eine neue Textdatei machen „# DIV/0!“ „# DIV/0!“ .

+1

ja wir tun. Was hast du probiert? – Julien

+0

Als eine Randnotiz benötigen Sie nicht unbedingt Python. Wenn Sie sich auf einem * nix-Rechner befinden, können Sie 'grep' verwenden. Wenn Sie das Original-Excel haben, können Sie damit eine saubere Datei erstellen. –

Antwort

1

Man könnte es auf diese Weise tun, die inkrementelle ist (so dass es nicht die gesamte Datei in den Speicher auf einmal gelesen):

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)) 
+0

Hallo Martineau, das ist toll. gestern habe ich versucht, ifilter zu benutzen, aber nicht funktioniert. Jetzt weiß ich, was das Problem war. – user3925736

+0

@martineau, kannst du bitte erklären, warum 'ifilter' in diesem Fall mächtiger ist als ein einfaches 'Listenverständnis'? zB 'outf.writelines ([Zeile für Zeile in inf wenn '# DIV/0!' Nicht in Zeile])' Ich wurde gesagt, als 'List Comprehensions' sind mehr Python, aber ich bin sicher, Sie haben Ihre Gründe dafür. –

+1

@Max: List Comprehensions sind definitiv Pythonic, aber nicht überraschend, sie erstellen eine Liste, die alle ihre Elemente gleichzeitig im Speicher benötigt - was oft gut ist.Wenn es jedoch potenziell viele davon gibt und/oder es keinen Grund gibt, sie zu behalten, ist es auch Pythonic, sie iterativ zu verarbeiten, ein Element zu der Zeit, das die minimale Menge an Ressourcen verbraucht. Soweit ich das beurteilen konnte, war das der Fall. – martineau

0
for line in open('a.txt').read().splitlines(): 
    if '#DIV/0!' not in line: 
     print(line) 
+3

Bitte bearbeiten Sie mit mehr Informationen. Code-only und "try this" Antworten werden abgeraten, da sie keine durchsuchbaren Inhalte enthalten und nicht erklären, warum jemand "das versuchen sollte". Wir bemühen uns, eine Ressource für Wissen zu sein. –

0
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() 
1
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]) 

Edit:

Diese Methode ist wahrscheinlich die schnellste. Aber wie schon zuvor mit @martineau besprochen, könnte es hier nicht die beste Antwort sein, abhängig von der Größe Ihrer Datei.

  • list comprehension[line for line in f if '#DIV/0!' not in
    line]
    ist sehr häufig in Python, es das Stück Code ersetzen:

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

aber es ist mehr optimiert (siehe hier für eine Erklärung: Efficiency of list comprehensions)

list comprehension laden alles im Speicher und kann somit bei großen Datenmengen einen Pufferüberlauf verursachen .

Deshalb ist es hier sicherer, eine inkrementelle Methode (@ Martineaus) zu verwenden, wenn Sie nicht sicher sind, wie viele Daten Sie verarbeiten werden!

  • Die with Anweisung ersetzen einen Versuch und fangen. Es schließt auch automatisch die Datei nach dem Block. Wie Sie sehen können, könnte es auch geschachtelt werden: Sie können mehrere Dateien mit einer with Anweisung öffnen.
+0

Eine kurze Beschreibung würde mit Neulingen einen langen Weg gehen. –

+0

Fertig! Ich habe meine Faulheit repariert –