Problem bei einem Script für Dateiöffnung

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
unix
User
Beiträge: 16
Registriert: Dienstag 20. Januar 2009, 16:22

Dienstag 20. Januar 2009, 16:34

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?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Dienstag 20. Januar 2009, 16:42

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 20. Januar 2009, 17:32

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
unix
User
Beiträge: 16
Registriert: Dienstag 20. Januar 2009, 16:22

Dienstag 20. Januar 2009, 19:04

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.
unix
User
Beiträge: 16
Registriert: Dienstag 20. Januar 2009, 16:22

Mittwoch 21. Januar 2009, 07:12

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 21. Januar 2009, 07:59

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
unix
User
Beiträge: 16
Registriert: Dienstag 20. Januar 2009, 16:22

Mittwoch 21. Januar 2009, 08:06

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 21. Januar 2009, 08:15

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 ;-)
unix
User
Beiträge: 16
Registriert: Dienstag 20. Januar 2009, 16:22

Mittwoch 21. Januar 2009, 08:20

: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?
Antworten