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.
janni80

Textdatei nach bestimmtem Inhalt absuchen

Beitragvon janni80 » Montag 28. Februar 2005, 00:22

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 28. Februar 2005, 07:02

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

Beitragvon janni80 » Montag 28. Februar 2005, 10:14

Hi Jens, wie kann ich das was ich als Ergebnis geliefert bekomme, in einer Datei abspeicher?
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 28. Februar 2005, 10:44

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

Beitragvon janni80 » Montag 28. Februar 2005, 11:19

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 28. Februar 2005, 11:52

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

Beitragvon Gast » Montag 28. Februar 2005, 12:10

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 28. Februar 2005, 12:21

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

Beitragvon janni80 » Montag 28. Februar 2005, 13:19

Hi Jens,

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

Danke schön.

Gruss Janni
janni80

Beitragvon janni80 » Montag 28. Februar 2005, 17:27

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 28. Februar 2005, 17:31

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...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 28. Februar 2005, 18:10

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 28. Februar 2005, 18:24

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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 28. Februar 2005, 19:31

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 Modvoice
BlackJack

Beitragvon BlackJack » Montag 28. Februar 2005, 23:08

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder