2017-12-15 2 views
0

Ich habe eine ‚test.txt‘ Datei, die enthält:Python - Zeile löschen, indem erste Zeichen

(5 rows) 
a 
(7 rows) 
b 

und ich möchte die Zeile löschen, wenn die Zeile beginnt mit dem Zeichen ‚(‘ Mein Code ist. hier:

with open("test.txt", "r") as fin: 
    with open("result.txt", "w") as fout: 
     for line in fin: 
      if line.startswith('('): 
       fout.write(line.replace('(','')) 
      else: 
       fout.write(line) 

kehrt aber:

5 rows) 
a 
7 rows) 
b 

ich möchte das Ergebnis erhalten:

a 

b 

Ist das mit 'starts.with' möglich?

Danke

+0

Wollen Sie eine leere Zeile als Ergebnis, wenn die Quellzeile mit einem '(' oder gar keiner Zeile beginnt? – Matthias

+1

Schreiben Sie einfach eine neue Zeile anstelle des gefundenen '(', dh 'fout.write (" \ n ")') – zwer

+0

ja Matthias ... –

Antwort

1

Sie ersetzen ein Zeichen und schreiben auch die Zeile.

Statt der, tun Sie fout.write('\n'), die eine neue Zeile schreibt

with open("test.txt", "r") as fin: 
    with open("result.txt", "w") as fout: 
     for line in fin: 
      if line.startswith('('): 
       fout.write('\n') 
      else: 
       fout.write(line) 
1

Sie müssen nur ändern, was Sie in den Fällen zu tun, wo die Linie tut Start mit einem (. Alles, was wir tun wollen, ist nur write ein Newline (\n). Wir wollen nicht replace etwas, wie wir die Linie ganz loswerden wollen.

So, hier ist das, was der fertige Code aussehen würde:

with open("test.txt", "r") as fin: 
    with open("result.txt", "w") as fout: 
     for line in fin: 
      if line.startswith('('): 
       fout.write("\n") 
      else: 
       fout.write(line) 

die result.txt wie schafft:

[empty line] 
a 
[empty line] 
b 

wo [empty line] stellt nur eine leere Zeile, sondern macht es offensichtlich, in diesem Antwort

0

Alternative mit "nicht":

with open("test.txt", "r") as fin: 
    with open("result.txt", "w") as fout: 
     for line in fin: 
      if not line.startswith('('): 
       fout.write(line + "\n") 
0

Ja, es ist möglich, mit der Methode .startswith() das zu tun, was Sie wollen. Ihr Scheck ist in Ordnung. Es ist das, was du tust, wenn du das Spiel findest, das deine Probleme verursacht.

with open("test.txt", "r") as fin: 
    with open("result.txt", "w") as fout: 
     for line in fin: 
      if line.startswith('('): 
       fout.write('\n') # fout.write(line.replace('(','')) 
      else: 
       fout.write(line) 

Wenn Sie der Linien loszuwerden, die mit ‚(‘ starten sie einfach nicht schreiben in die neue Datei aus ... Schreibe eine leere Zeile aus (nur Zeilenendmarke) statt. Das Ersetzen von Zeilen, die mit einem '(' mit Leerzeilen beginnen) scheint aufgrund Ihrer obigen Beschreibung das zu sein, was Sie wollen.

Wenn Sie nicht ersetzen wollen die ‚(‘ Zeilen mit Leerzeilen, dann können Sie Ihren Code ein wenig einfacher sein:

  if line.startswith('('): 
       fout.write('\n') # fout.write(line.replace('(','')) 
      else: 
       fout.write(line) 

kann nur

  if not line.startswith('('): 
       fout.write(line) 
0

sein können Sie erreichen Ihre gewünschte Ausgabe folgende Schritte

  • Öffnen Sie die gewünschte Datei in read Modus
  • Lesen Sie alle Linien
  • Datei schließen
  • Öffnen Sie die Datei wieder in write Modus
  • Schreibleitungen gewünscht, ersetzen unerwünschte mit \n
  • Datei schließen

    f = open("test.txt","r") 
    lines = f.readlines() 
    f.close() 
    
    f = open("test.txt","w") 
    
    for line in lines: 
        if not line.startswith('('): 
         f.write(line) 
        else: 
         f.write('\n') 
    
    f.close() 
    
0

Statt fout.write(line.replace('(','')) nur Verwendung:

fout.write('\n'), die diese Linie mit einer neuen Zeile Zeichen ersetzen wird, so dass Sie Code wäre:

with open("test.txt", "r") as fin: 
    with open("result.txt", "w") as fout: 
     for line in fin: 
      if line.startswith('('): 
       fout.write('\n') 
      else: 
       fout.write(line) 
1

One auch System verwenden können Befehle auf Dateien zu arbeiten. Zum Beispiel in Linux:

import os 
os.system("cat test.txt | sed 's/^(.*$//' > results.txt") 

cat liest die infile out, | zum Rohr wird der Ausgang auf, der mit sed( zu Leerzeilen beginnen und schließlich nach outfile > umleitet Ausgang ersetzt.

Verwandte Themen