Textdatei nach bestimmtem Inhalt absuchen

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
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
Benutzeravatar
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:

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
janni80

Hi Jens, wie kann ich das was ich als Ergebnis geliefert bekomme, in einer Datei abspeicher?
Benutzeravatar
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()
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
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.
Benutzeravatar
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:

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...
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Oh, sorry :oops:
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()
janni80

Hi Jens,

vielen vielen Dank, das hat genau so geklappt wie ich es mir vorgestellt habe.

Danke schön.

Gruss Janni
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?
Benutzeravatar
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...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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*
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Antworten