Seite 1 von 1

Problem bei einem Script für Dateiöffnung

Verfasst: Dienstag 20. Januar 2009, 16:34
von unix
Hi,
ich schreibe gerade ein kleines Script, das eine Datei öffnet und dieses nach zwei Characters durchsucht, den Inhalt zwischen beiden Character und das erste Character löscht, den Rest der Datei aber beibehält.

Code: Alles auswählen

import re

fobj = open("test.txt", "r")
for line in fobj:
    a = line
    b_re = re.compile(r"#(.*?)\;", re.I)
    for match in b_re.findall(a):
        test = match
        print test
        test = ";"
        print test

fobj.close()

Beispiel wie eine Datei aussieht die ich öffnen möchte:

Code: Alles auswählen

test;test2349234d;ewrwer;werwer;test#test2,;blabla;
te34tst;test2349t34t234d;ewr54t4wer;werwer;testtest2,;
test;test2349234d;ewrwer;werwer;testtes234,;
test;test34t349234d;ew;test#rwer;werwerte234234t2,;
Die richtige Datei sollte dann so aussehen:

Code: Alles auswählen

test;test2349234d;ewrwer;werwer;test;blabla;
te34tst;test2349t34t234d;ewr54t4wer;werwer;testtest2,;
test;test2349234d;ewrwer;werwer;testtes234,;
test;test34t349234d;ew;test;werwerte234234t2,;
Die Datei kann ich öffnen und ich finde auch die Strings die rausgehören. Allerdings weiß ich nun nicht genau, wie ich den Inhalt von test (test ist beispielsweise nur "rwer"; ich möchte aber auch das erste Zeichen nach dem ich suche löschen, also das "#" => temp2 = "#" + temp (?)) und die Datei so verändern, dass aus der Datei alle Strings entfernt worden, wo "#inhalt" vorkommt, bis zum ersten ";" Zeichen.

Weiß jemand wie ich das machen kann?

Verfasst: Dienstag 20. Januar 2009, 16:42
von helduel
Moin,

wenn auch das erste Zeichen in der Gruppe auftauchen soll, dann pack es mit in die Klammer. Ansonsten gibt es die Methode sub, mit der du automatisch Text ersetzen kannst. Damit die Änderungen in der Datei auftauchen, musst du natürlich wieder in die Datei schreiben (oder eine neue erzeugen).

Gruß,
Manuel

Verfasst: Dienstag 20. Januar 2009, 17:32
von sma
Ich befürworte zwar sonst immer Lösungen, die nicht die ganze Datei auf einmal verarbeiten, aber vorausgesetzt, es sind nur wenige (MB) Daten, reicht doch:

Code: Alles auswählen

s = open("test.txt").read(); print re.sub(r"#[^;]*", "", s)
Stefan

Verfasst: Dienstag 20. Januar 2009, 19:04
von unix
Die Daten sind nicht immer gleich groß, durchschnittlich etwa 30MB, was für reine Textdateien eigentlich nicht wenig ist.

Danke für die bisherigen Antworten.
Bevor das Script durchläuft, habe ich nun noch die Funktion

Code: Alles auswählen

shutil.copyfile("test.txt", "test.backup")
hinzugefügt, sodass eine Sicherungsdatei erstellt wird, falls etwas nicht richtig funktionieren sollte.

Da ich vorhin etwas wenig Zeit hatte, hier nochmal eine etwas ausführlichere Erklärung was ich gerne hätte:

Ich öffne eine Datei, welche in etwa wie folgt aufgebaut ist:

Code: Alles auswählen

name;sandra;apfel #kuchen;inhalt;213123;name;
peter;birne;213123;irgendwas;nichts;
hier;kommt;noch#ein weitere123§;Fehler
Das Script soll nun die Datei komplett durchsuchen, wobei alles was ab dem "#" Zeichen beginnt (bzw. das "#" - selbst eingeschlossen) bis zum ersten ";" entfernt werden soll.
Dann sollte im obigen Beispiel die Datei wie folgt aussehen, nachdem das Script darüber gelaufen ist:

Code: Alles auswählen

name;sandra;apfel inhalt;213123;name;
peter;birne;213123;irgendwas;nichts;
hier;kommt;nochFehler
Zusätzlich würde es mich noch interessieren, in welcher Zeile ein fehlerhafter Eintrag gefunden wurde (einen Counter hochzählen lassen in einer Schleife?) und jede Zeile, in der ein Fehler gefunden wurde, zwischenspeichern und am Ende alle gefunden Fehler in eine zusätzliche Textdatei abspeichern, sodass ich im nachhinein feststellen kann, wo genau es welche Fehler gegeben hat.

Kann mir da bitte jemand weiterhelfen? Habe es bisher leider nicht geschafft.

Verfasst: Mittwoch 21. Januar 2009, 07:12
von unix
Wie kann ich den Code von Dir, sma, nun in eine Datei umleiten, sodass alle 'fehlerhaften' Strings entfernt wurden?
Mit dem Code kann ich jetzt aber nicht alle fehlerhaften Lines in eine zusätzliche Datei speichern, damit ich sehe, wo die fehlerhaften Einträge waren, oder? Habe mich gestern noch damit rumgespielt, aber leider kein gewünschtes Ergebnis bekommen.

Von der Geschwindigkeit ist Dein Code in Ordnung, da ich damit nur eine etwas bequemere und schnellere Methode Suche, um nicht alles per Hand machen zu müssen.

Momentan wird der Inhalt der Datei ja in der CommandPrompt ausgegeben. Kann ich dies irgendwie in eine Datei umleiten? Dann wäre das Problem erledigt denke ich.

Verfasst: Mittwoch 21. Januar 2009, 07:59
von numerix
unix hat geschrieben:Momentan wird der Inhalt der Datei ja in der CommandPrompt ausgegeben. Kann ich dies irgendwie in eine Datei umleiten? Dann wäre das Problem erledigt denke ich.

Code: Alles auswählen

python myskript.py > myfile.txt

Verfasst: Mittwoch 21. Januar 2009, 08:06
von unix
Danke, aber bist Du dir sicher? Ich bekomme einen Error:

Code: Alles auswählen

  File "C:\Python26\AutoScript.py", line 41
    python AutoScript.py > filename
                    ^
SyntaxError: invalid syntax
filename ist eine Variable die den Dateinamen enthält.
Auch python "AutoScript.py" > filename funktioniert nicht.

Ich starte das Script von der CMD aus.

Verfasst: Mittwoch 21. Januar 2009, 08:15
von Hyperion
unix hat geschrieben:Danke, aber bist Du dir sicher? Ich bekomme einen Error:

Code: Alles auswählen

  File "C:\Python26\AutoScript.py", line 41
    python AutoScript.py > filename
                    ^
SyntaxError: invalid syntax
Du sollst genau das in der Shell eintippen - und nicht in dein Script reinschreiben ;-)

Verfasst: Mittwoch 21. Januar 2009, 08:20
von unix
:oops:

Vielen Dank euch allen für die Hilfe ;)
Die fehlerhaften Einträge habe ich zwar nicht, aber das war mir auch nicht so wichtig.
Die Hauptfunktion ist gegeben, und dass mit sowenig Codezeilen.
Vielen Dank.

edit: Bei der oben geposteten Testdatei funktioniert es wie gewünscht. Ich wollte nun einen Testlauf mit einer richtigen Datei machen, allerdings ist das Ergebnis etwas seltsam, da die ursprüngliche Größe (also mit den Fehlern -> mehr Text) kleiner ist, als die neue Datei, ohne die Fehlerstrings.
Kann es einen Grund geben, obwohl das Script wie gewünscht funktioniert oder gibt es irgendwo einen Fehler?