Seite 1 von 1
Textdatei nach bestimmtem Inhalt absuchen
Verfasst: Montag 28. Februar 2005, 00:22
von janni80
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
Verfasst: Montag 28. Februar 2005, 07:02
von jens
Das höhrt sich für einen Job mit re.findall() an, such mal im Forum...
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
Verfasst: Montag 28. Februar 2005, 10:14
von janni80
Hi Jens, wie kann ich das was ich als Ergebnis geliefert bekomme, in einer Datei abspeicher?
Verfasst: Montag 28. Februar 2005, 10:44
von jens
Code: Alles auswählen
# Datei schreibend öffnen
FileHandle = file( "GefungeneStrings.txt", "w" )
# Inhalt schreiben
FileHandle.write( GefungeneStrings )
# Datei schließen
FileHandle.close()
Schau dir mal ein paar Doku's an:
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
Verfasst: Montag 28. Februar 2005, 11:19
von janni80
Hi Jens,
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 -
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:
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.
Verfasst: Montag 28. Februar 2005, 11:52
von jens
Hmm... In dem Falle würde ich das direkt in einem machen:
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()
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...
Verfasst: Montag 28. Februar 2005, 12:10
von Gast
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...
Nachteil: Die log-datei ist danach leer. Also: Kids, don't try at home!
joe
Verfasst: Montag 28. Februar 2005, 12:21
von jens
Oh, sorry
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()
Wenn es aber die selbe Datei sein soll:
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()
Verfasst: Montag 28. Februar 2005, 13:19
von janni80
Hi Jens,
vielen vielen Dank, das hat genau so geklappt wie ich es mir vorgestellt habe.
Danke schön.
Gruss Janni
Verfasst: Montag 28. Februar 2005, 17:27
von janni80
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:
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()
Danke schonmal im voraus
Gruss Janni
Edit (Leonidas): Code in Python Tags gesetzt... könntest du das das nächste mal bitte selbst machen?
Verfasst: Montag 28. Februar 2005, 17:31
von jens
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...
Verfasst: Montag 28. Februar 2005, 18:10
von Leonidas
jens hat geschrieben:Also du könntest die "line" mit split(" ") in eine Liste wandeln
Ich würds nur mit split() machen, das teilt generell bei Whitespaces...
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()
Verfasst: Montag 28. Februar 2005, 18:24
von jens
Leonidas hat geschrieben:Ich würds nur mit split() machen, das teilt generell bei Whitespaces...
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...
Also sowas wie
ItemListe = line.split(" ", 4) denn ich glaube
.split(,4) geht nicht, oder?
Verfasst: Montag 28. Februar 2005, 19:31
von Leonidas
jens hat geschrieben:Also sowas wie ItemListe = line.split(" ", 4) denn ich glaube .split(,4) geht nicht, oder?
Nein sowas nicht, aber
split(None, 4). Die tollen Split Tricks hat mir Dookie beigebracht. *schief*
Verfasst: Montag 28. Februar 2005, 23:08
von BlackJack
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.