2016-03-24 5 views
0

Ich habe eine Datei, die sich wiederholende Zeilen <this is repeated>, die ich mit leerem Speicherplatz "" ersetzen möchte. Das erste Auftreten oder das letzte Auftreten der wiederholten Linie muss jedoch nicht ersetzt werden. Ich habe versucht replace() vor, aber diese Funktion wird alle Zeichenfolgen in der Datei ersetzen. Gibt es eine Möglichkeit, es zu schreiben, um das erwartete Ergebnis zu erhalten? Ps: Es ist ein großer TextPython: Ersetze repetitive Zeile in einer Datei mit leerem Leerzeichen, aber nicht beim ersten/letzten Auftreten

Die Datei ist wie folgt Datei:
<this is repeated>
second line
another lines
third line
<this is repeated>
<this is repeated>

+0

Lesen Sie die Linien der Datei und vergleichen Sie die Zeilen ... wenn die aktuelle Zeile unterscheidet sich von der letzten, schreiben Sie es in Ihre Ausgabedatei, sonst überspringen Sie es und schreiben Sie eine leere Zeile ... es gibt nicht viel mehr dazu ... –

+0

Würde es sie durch eine leere Zeile ersetzen oder die ganze Zeile entfernen? –

Antwort

0

Hinweis: Ich erkannte nach der Einlieferung, dass, wenn das letzte Vorkommnis war die allerletzte Zeile ohne \n nach dieser Technik würde es ebenso wie das nächstletzte Auftreten verlassen.

Zuerst müssten Sie über die Datei wiederholen, bis Sie das erste Vorkommen finden:

file = <OPEN FILE> 
rep_line = "<this is repeated>\n" 

beginning = "" #record all data until found 
while True: #broken when rep_line is found in file (or end of file is reached) 
    line = file.readline() 
    if not line: 
     raise EOFError("reached end of file before finding first occurence") 
    beginning+=line 
    if line == rep_line: 
     break 

rest = file.read() #you can read the rest after iterating over a few lines 

Dann werden Sie beginning haben, die alles bis einschließlich dem ersten Vorkommen enthält, und die rest

Also alles, was Sie mit rest tun müssen, ist zu count, wie die Zeit kann es auftritt, und ersetzen Sie alle, aber die letzte:

reps = rest.count(rep_line) 

new_text = beginning + rest.replace(rep_line,"",reps - 1) 
               # ^don't replace the last one 

aber dieser direkte Ansatz wird auf Linien auswählen, die mit dem Text (wie "hello <this is repeated>" zum Beispiel) zu beenden und dies kann durch auch die Überprüfung festgelegt werden, dass es eine \ n Recht vor der Zeile:

reps = rest.count("\n"+rep_line) 

new_text = beginning + rest.replace("\n"+rep_line,"\n",reps - 1) 
                #^replace with a single newline 
+0

Wenn Sie es durch eine leere Zeile ersetzen wollen, anstatt es komplett zu entfernen, ersetzen Sie es einfach durch '' \ n "' oder für das letzte Beispiel '" \ n \ n "', um die leere Zeile zu verlassen. –

+1

Ich habe diesen Fehler "Mixing Iteration und lesen Methoden verlieren Daten" bei Zeile Rest = file.read(). Weißt du, warum? – wanderergirl

+0

Nun, ich nehme an, weil Sie nicht nur 'open (" my_file.txt ")' oder Sie sind und haben 'von LIBRARY import *' mit einer Bibliothek, die eine 'open' Funktion hat, so wie ich Antwort bearbeitet Verwenden Sie 'file.readline()' stattdessen, da das sowieso wahrscheinlich besser ist. –

Verwandte Themen