Seite 1 von 1

Textzeile ersetzen

Verfasst: Freitag 23. Mai 2003, 09:19
von HarryH
Hallo!
Ich bin noch ziemlich neu in Python und hätte da ein Problem.
Ich möchte in einer Text-Datei eine bestimmte Zeile durch eine neue ersetzen.

z.B
"N10Durchmesser"
durch
"N10Fraeserdurchmesser"

Die Zeile steht innerhalb der ersten 12 Zeilen der Text-Datei. Es soll die
erste Zeile gefunden werden und dann durch sie zweite ersetzt werden.

Für guten Rat wäre ich sehr dankbar!

Re: Textzeile ersetzen

Verfasst: Freitag 23. Mai 2003, 10:44
von Voges
Hallo!

Im Prinzip geht das über das zeilenweise Umkopieren (z.B. mit readlines(),write()) in eine temporäre Datei. Wenn eine eingelesene Zeile Deinem Suchbegriff entspricht, schreibst Du anstelle dieser Zeile Deinen neuen Begriff in die temporäre Datei.
Deine Ausgangsdatei ersetzt Du danach durch die neu entstandene Datei (z.B. mit shutil.copy()).

Jan

re:

Verfasst: Freitag 23. Mai 2003, 10:56
von HarryH
Schon mal vielen Dank für deine Auskunft!
Aber gibt es nicht auch einen schnelleren Weg, was die Verarbeitungszeit betrifft.
Die Textdateien die ich bearbeiten muß, können teilweise einige MByte groß sein und ich möchte eine ganze Reihe davon in einer Schleife bearbeiten.
Wenn ich jede Datei komplett temporär speichere und dann die alte Datei wieder überschreibe kann das ziemlich lang daueren.
Geht es nicht auch schneller?

Re: re:

Verfasst: Freitag 23. Mai 2003, 11:46
von Voges
Um eine tmp-Datei kommst Du IMO nicht rum, zumindest nicht, wenn alter und neuer Text nicht die gleiche Länge haben. Aber selbst dann, würde man aus Gründen der Vorsicht mit einer tmp-Datei arbeiten.

Wenn Du weißt, dass die ersten 12 Zeilen nie mehr als z.B. 2048 Byte belegen, könnte ich mir Folgendes vorstellen:
- anfang = fin.read(2048)
- Dann in anfang den Begriff in geeigneter Weise ersetzen (mit string.replace() oder re.sub() vielleicht).
- fin.seek(2048) # an den Startpunkt des Restes der Datei springen
- rest = fout.write(fin.Dateigröße - 2048) # Rest der Datei einlesen
- fout.write(anfang)
- fout.write(rest)

Vielleicht ist das schneller.
Anm:
- Wichtig: Unter Windows, dass die Dateien binär geöffnet werden, also mit "rb" und "wb".
- Wieviel Byte die ersten 12 Zeilen umfassen, ließe ich auch relativ einfach ermitteln.
- Das Einlesen des Restes könnte natürlich auch Häppchenweise geschehen. Bei GB-großen Dateien sicherlich empfehlenswert. Irgendwo wird es allerdings eine absolute Grenze geben für z.B. das Positionieren mit seek().

Jan

re:

Verfasst: Freitag 23. Mai 2003, 11:54
von HarryH
Vielen Dank für deine konkreten Auskünfte!

Harry :)

Re: re:

Verfasst: Freitag 23. Mai 2003, 14:57
von hans
HarryH hat geschrieben:Aber gibt es nicht auch einen schnelleren Weg, was die Verarbeitungszeit betrifft.
Die Textdateien die ich bearbeiten muß, können teilweise einige MByte groß sein und ich möchte eine ganze Reihe davon in einer Schleife bearbeiten.
Wenn ich jede Datei komplett temporär speichere und dann die alte Datei wieder überschreibe kann das ziemlich lang daueren.
Geht es nicht auch schneller?
Welches OS setzt du denn ein?

Muß es unbedingt Python sein? (Ich möchte dir hiermit nicht von einer Pythonprogrammierung abraten, sondern nur klarstellen was sein muß)

Was sind das für Dateien? Sind die strukturiert oder ist das beliebiger Text? Wenn strukturiert, dann bietet sich vielleicht eine Datenbank an.

Unter Linux / Unix setzt man für so etwas awk und sed ein. Besonders der sed (Stream Editor) kann Dateien beliebiger Größe verarbeiten. Viellweicht gibt's ja irgendwo im Internet den auch für Windows. Die maximal zu verarbeitende Dateigröße ist bei sed durch den freien Festplattenbereich begrenzt :D Auch sed und awk speichern erst einmal temporär.

Du siehst, viele Lösungsansätze aber noch keineLösung.

Hans

re

Verfasst: Montag 26. Mai 2003, 09:46
von HarryH
Ich arbeite mit Windows.
Es sind Nc-Dateien mit der Dateiendung ".nc" und sind im Textformat geschrieben.
Die zu bearbeitenden Dateien sind folgendermaßen strukturiert.
Jeder einzelne Satz beginnt mit "N" und einer fortlaufenden Nummer - beginnend bei 1
Also:
N1..Text...
N2..Text...
N3..Text...
...bis z.B.
N1000000..Text...

Verfasst: Montag 26. Mai 2003, 15:18
von Glamdring
Geht das nicht mit string.replace()?

Ich hab zwar auch net viel Ahnung aber ich würde das so machen
erst string importieren dann dein Code, dann öffnen und volgendes eingeben:

Code: Alles auswählen


# wenn a der eingelesene Inhalt der Datei ist:
a.replace(a, alterstring, neuerstring)

so müsste es gehen!
Hab aber keine Ahnung