Hi,
programmiere zum ersten Mal in Python und möchte in Python aus einer Textdatei nach einem gewissen String suchen und ihn dann abspeicher. Kann mir jemand weiterhelfen?
Vielen Dank schonmal im Voraus.
Gruss Janni
Textdatei nach bestimmtem Inhalt absuchen
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das höhrt sich für einen Job mit re.findall() an, such mal im Forum...
Hier ein kleine Anregung:
Hier ein kleine Anregung:
Code: Alles auswählen
import re
# Datei lesend öffnen
FileHandle = file( "sourceDatei.txt", "r" )
# Inhalt komplett auslesen
SourceDateiInhalt = FileHandle.read()
# Datei schließen
FileHandle.close()
# Suche
GefungeneStrings = re.findall( r"MeinSuchString", SourceDateiInhalt )
# Anzeige der Ergebnisse
print GefungeneStrings
Hi Jens, wie kann ich das was ich als Ergebnis geliefert bekomme, in einer Datei abspeicher?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Code: Alles auswählen
# Datei schreibend öffnen
FileHandle = file( "GefungeneStrings.txt", "w" )
# Inhalt schreiben
FileHandle.write( GefungeneStrings )
# Datei schließen
FileHandle.close()
Python Referenz von David M. Beazley: http://www.reportlab.org/docs/PythonReferenz.pdf
Python Tutorial: http://www.informatik.uni-frankfurt.de/ ... python.pdf
Noch im Entstehen: http://de.wikibooks.org/wiki/Python
Deutsche Links auf Python.org: http://www.python.org/doc/NonEnglish.html#german
Hi Jens,
die Links haben mir sehr geholfen, hab nur noch ein Problem. Du musst dir vorstellen, ich habe folgendes Log-File :
Wenn der Wert "1031" vorkommt, soll der ganze Block in die neue Datei übernommen werden. Kann ich es mit writeline machen oder nicht? Ich habe es momentan folgendermassen geregelt:
Gruss Janni
Edit (Leonidas): Code getaggt.
die Links haben mir sehr geholfen, hab nur noch ein Problem. Du musst dir vorstellen, ich habe folgendes Log-File :
Code: Alles auswählen
2005-2-6 0:0:6 GMT 192.168.40.15 samsungproxye.sdsg.de - SAMSUNGEXCGW1 106.101.1.108 smkim@samsung.de 1020 dr$j51$6mx$uu2h@c6rg5g9 1 0 2870 1 2005-2-6 0:0:6 GMT 0 Version: 5.0.2195.6713 - 4000!1% 24ð ????! tb va7lclvf@yahoo.com -
2005-2-6 0:0:6 GMT 192.168.40.15 samsungproxye.sdsg.de samsungexcdb1.samsung.samsungeurope.de SAMSUNGEXCGW1 106.101.1.108 smkim@samsung.de 1031 dr$j51$6mx$uu2h@c6rg5g9 1 0 2870 1 2005-2-6 0:0:6 GMT 0 Version: 5.0.2195.6713 - 4000!1% 24ð ????! tb va7lclvf@yahoo.com -
Code: Alles auswählen
import re
# Datei lesend öffnen
FileHandle = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog_example.log", "r" )
# Inhalt komplett auslesen
SourceDateiInhalt = FileHandle.read()
# Datei schließen
FileHandle.close()
# Suche
GefundeneStrings = re.findall( r"1031", SourceDateiInhalt )
# Anzeige der Ergebnisse
print GefundeneStrings
# Datei schreibend öffnen
FileHandle = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog_example.log", "w" )
# Inhalt schreiben
FileHandle.writelines( GefundeneStrings )
# Datei schließen
FileHandle.close()
Gruss Janni
Edit (Leonidas): Code getaggt.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hmm... In dem Falle würde ich das direkt in einem machen:
Hat den Vorteil, das das Log-File nicht auf einmal geladen werden... Somit können die super lang sein, ohne das es Probleme geben sollte...
Code: Alles auswählen
infile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog_example.log", 'r')
outfile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog_example.log", 'w')
for line in infile:
if "1031" in line:
outfile.write(line)
infile.close()
outfile.close()
Nachteil: Die log-datei ist danach leer. Also: Kids, don't try at home!jens hat geschrieben:Hat den Vorteil, das das Log-File nicht auf einmal geladen werden... Somit können die super lang sein, ohne das es Probleme geben sollte...
joe
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Oh, sorry
Es wird beide male die selbe Datei geöffnet.... Es sollte natürlich in eine neue Datei geschrieben werden:
Wenn es aber die selbe Datei sein soll:

Es wird beide male die selbe Datei geöffnet.... Es sollte natürlich in eine neue Datei geschrieben werden:
Code: Alles auswählen
infile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog_example.log", 'r')
outfile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\result.log", 'w')
for line in infile:
if "1031" in line:
outfile.write(line)
infile.close()
outfile.close()
Code: Alles auswählen
FileHandle = file( "access_log.www.jensdiemer.de", "r" )
GefundeneStrings = ""
for line in FileHandle:
if "1031" in line:
GefundeneStrings += line
FileHandle.close()
# Datei überschreiben
FileHandle = file( "test.log", "w" )
FileHandle.write( GefundeneStrings )
FileHandle.close()
Hi Jens,
vielen vielen Dank, das hat genau so geklappt wie ich es mir vorgestellt habe.
Danke schön.
Gruss Janni
vielen vielen Dank, das hat genau so geklappt wie ich es mir vorgestellt habe.
Danke schön.
Gruss Janni
Hi Jens,
mein File sieht momentan so aus:
2005-2-21 0:0:22 GMT 192.168.40.10 abcd@sdsg.de
Mit welchen Hilfsmitteln kann ich in Python die Spalte 4 ansprechen (sprich abcd@sdsg.de). Ich möchte überprüfen, ob in der Spalte ein "@sdsg.de" vorkommt, wenn ja kopieren, wenn nein gehe weiter...
Hier mein momentaner Code:
Danke schonmal im voraus
Gruss Janni
Edit (Leonidas): Code in Python Tags gesetzt... könntest du das das nächste mal bitte selbst machen?
mein File sieht momentan so aus:
2005-2-21 0:0:22 GMT 192.168.40.10 abcd@sdsg.de
Mit welchen Hilfsmitteln kann ich in Python die Spalte 4 ansprechen (sprich abcd@sdsg.de). Ich möchte überprüfen, ob in der Spalte ein "@sdsg.de" vorkommt, wenn ja kopieren, wenn nein gehe weiter...
Hier mein momentaner Code:
Code: Alles auswählen
infile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\20050221.log", 'r')
outfile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog.log", 'w')
for line in infile:
if "1031" in line:
outfile.write(line)
infile.close()
outfile.close()
Gruss Janni
Edit (Leonidas): Code in Python Tags gesetzt... könntest du das das nächste mal bitte selbst machen?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also du könntest die "line" mit split(" ") in eine Liste wandeln und die das letzte Element untersuchen... Aber ich denke es würde auch einfach reichen die 'if "1031" in line' Zeile mit einem 'or "@sdsg.de" in line' zu erweitern...
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich würds nur mit split() machen, das teilt generell bei Whitespaces...jens hat geschrieben:Also du könntest die "line" mit split(" ") in eine Liste wandeln
Code: Alles auswählen
infile = file("C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\20050221.log", 'r')
outfile = file("C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog.log", 'w')
for line in infile:
if "1031" in line or '@sdsg.de' in line:
outfile.write(line + '\n')
infile.close()
outfile.close()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das stimmt... Ich würde allerdings die Anzahl einschränke, wenn man mit split() arbeiten sollte... Denn ich denke das nach der IP-Adresse sicherlich in der ein oder anderen zeile nochmale Leerzeichen vorkommen können...Leonidas hat geschrieben:Ich würds nur mit split() machen, das teilt generell bei Whitespaces...
Also sowas wie ItemListe = line.split(" ", 4) denn ich glaube .split(,4) geht nicht, oder?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nein sowas nicht, aber split(None, 4). Die tollen Split Tricks hat mir Dookie beigebracht. *schief*jens hat geschrieben:Also sowas wie ItemListe = line.split(" ", 4) denn ich glaube .split(,4) geht nicht, oder?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Und man kann natürlich auch immer den Namen des Parameters benutzen, also ``split(maxsplit=4)``
Weiter oben war ein Beitrag, wo in der Schleife immer eine neue Zeichenkette an eine vorhandene angehängt wurde -- das sollte man nicht machen weil dabei immer eine neue Zeichenkette angelegt wird und die beiden alten kopiert werden müssen. Das wird mit der Zeit immer langsamer. Besser ist es alle Zeichenketten in einer Liste zu speichern und diese dann mit der `writelines()` Methode in die Datei zu schreiben.
Weiter oben war ein Beitrag, wo in der Schleife immer eine neue Zeichenkette an eine vorhandene angehängt wurde -- das sollte man nicht machen weil dabei immer eine neue Zeichenkette angelegt wird und die beiden alten kopiert werden müssen. Das wird mit der Zeit immer langsamer. Besser ist es alle Zeichenketten in einer Liste zu speichern und diese dann mit der `writelines()` Methode in die Datei zu schreiben.