Textzeile ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

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!
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

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?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Vielen Dank für deine konkreten Auskünfte!

Harry :)
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

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...
Glamdring
User
Beiträge: 104
Registriert: Sonntag 25. Mai 2003, 20:22
Wohnort: Freiburg i.B.
Kontaktdaten:

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
Dies ist ein Platzhalter, er steht am Ende jeder meiner Beiträge! Erst wenn ich einen vernünftigen Text gefunden habe wird sich das ändern!
Antworten