Seite 1 von 2

Spezielle Texte aus einer Textdatei kopieren

Verfasst: Dienstag 14. Juli 2009, 16:58
von Knuspersuppe
Hi,

bin recht unerfahren mit dem Programm Python^^
Ersteinma zu meinem Problem...
Ich habe ein Verzeichnis.
In diesem Verzeichnis befinden sich Textdateien.
In diesen Textdateien soll ich nach einem bestimmten Begriff suchen und diese dann rausschreiben.

Wie kann ich es also mit Python anstellen, alle Textdateien in diesem Verzeichnis absuchen zu lassen, und dann jede Zeile, in der dieser Begriff vorkommt zu kopieren und in einem Textdokument abzuspeichern?

Wie ich eine Textdatei öffne und das geschriebene lese weis ich schon (fileHandle = open("Pfad zur Datei","r" etc...)

Verfasst: Dienstag 14. Juli 2009, 17:35
von nemomuk
os.walk, os.path.splitext, readlines

diese Stichworte solten eigentlich reichen...

Verfasst: Dienstag 14. Juli 2009, 18:01
von Knuspersuppe
Hm also damit komme ich nicht so richtig weiter, da heute mein 2. Tag mit Python ist. :(
Hab mir mal ein uraltes Buch zu Python durchgelesen und nutze daher auch momentan noch Python 2.35

Verfasst: Dienstag 14. Juli 2009, 18:11
von Defnull
1) Python 2.6 installieren
2) Lesen: http://docs.python.org/tutorial/index.html
3) Nachschlagen: http://docs.python.org/lib/lib.html

Verfasst: Dienstag 14. Juli 2009, 18:15
von Knuspersuppe
Ok, vielen Dank :D

Verfasst: Dienstag 14. Juli 2009, 18:18
von lunar
Defnull hat geschrieben:1) Python 2.6 installieren
2) Lesen: http://docs.python.org/tutorial/index.html
3) Nachschlagen: http://docs.python.org/lib/lib.html
Darf ich mir das kopieren und für eigene Postings verwenden? ;)

Verfasst: Dienstag 14. Juli 2009, 18:21
von cofi
Alternativ:

1) Python 3.1 installieren
2) Lesen: http://docs.python.org/3.1/tutorial/index.html oder auch http://tutorial.pocoo.org (deutsche Uebersetzung)
3) Nachschlagen: http://docs.python.org/3.1/library/index.html

Verfasst: Mittwoch 15. Juli 2009, 11:32
von Knuspersuppe
So,
ich habe jetzt einen Script geschrieben, welcher die genannten daten öffnet und den gesuchten Inhalt in ein Textdokument speichert.
Allerdings habe ich in dem Ordner rund 50 Daten, welche ich absuchen muss :/
Wie kann ich Python sagen, dass es im kompletten Verzeichnis in den einzelnen Daten automatisch nachschauen soll und diese dann in einem Textdokument speichert?
Hier mal mein Code:

Code: Alles auswählen

global f

f=open("c:/Documents and Settings/*****/Desktop/*****/Datei", "r")

f1 = open("C://vmi-buch/ifdef.txt",'w')

def new1():
    for line in f.readlines():
        if line.find('#ifdef')>=0:
           f1.write("%s" %line)
new1()
f.close()



f=open("c:/Documents and Settings/*****/Desktop/*****/Datei", "r")

f2 = open("C://vmi-buch/ifndef.txt",'w')

def new2():
    for line in f.readlines():
        if line.find('#ifndef')>=0:
           f2.write("%s" %line)
new2()
f.close()

Verfasst: Mittwoch 15. Juli 2009, 12:41
von EyDu
_Verstehen_ des Tutorials. Da wird von so etwas wie "Funktionen" und "Schleifen" gesprochen, damit man Code nicht kopieren muss. Alles andere wurde schon genannt.

Verfasst: Mittwoch 15. Juli 2009, 21:59
von BlackJack
@Knuspersuppe: ``global`` auf Modulebene hat keinen Effekt. Man sollte auf ``global`` sowieso verzichten.

Die Ergebnisdatei wird zweimal geöffnet, aber nie explizit geschlossen.

Man kann direkt über Dateiobjekte iterieren. Die `readlines()`-Methode liest die gesamte Liste auf einmal ein.

Ob eine Zeichenkette in einer anderen enthalten ist, testet man idiomatischer mit dem ``in``-Operator.

``'%s' % line`` ist eine kompliziertere Variante einfach ``line`` zu schreiben, wenn der Typ von `line` sowieso schon `str` ist.

Verfasst: Donnerstag 16. Juli 2009, 07:38
von Knuspersuppe
So, hab jetzt rausgefunden, wie man alle Daten mit einer bestimmten Endung aus dem Verzeichnis auflistet.
Jetzt muss ich nurnoch wissen, wie man nun diese speziellen Daten nacheinander öffnet und nach dem gesuchten Wort durchsucht und die Zeile, in der dieses Wort steht dann in ein Textdukument speichert. :?

Hier mal der Code:

Code: Alles auswählen

import os 

startdir = "c:/Documents and Settings/*****/Desktop/*****/Daten/"

for root, dirs, file in os.walk(startdir): 
    print "" * (root.count(os.sep) - startdir.count(os.sep)), 
    print os.path.split(root)[1], 
for Name in file:
    if Name.endswith('.blabla'):
       print Name
    elif Name.endswith('.blubblub'):
       print Name




f=open("c:/Documents and Settings/*****/Desktop/*****/Daten/Name.blabla")

f1 = open("C://vmi-buch/ifdef.txt",'a')

def new1():
    for line in f.readlines():
        if line.find('#ifdef')>=0:
           f1.write(line)
new1()
f.close()




f=open("c:/Documents and Settings/*****/Desktop/*****/Daten/Name.blabla")

f2 = open("C://vmi-buch/ifdef.txt",'a')

def new2():
    for line in f.readlines():
        if line.find('#ifndef')>=0:
           f2.write(line)
new2()


f.close()


Verfasst: Donnerstag 16. Juli 2009, 09:27
von Hyperion
Die Einrückung ab Zeile 9 stimmt sicher nicht, oder?

Du solltest nicht file als Namen wählen - file ist ein Python built-in, welches Du damit überschreibst. Wähle doch z.B. filename.

Funktionen sollten sinnvolle Namen tragen. new1 und new2 sind sicherlich keine ;-)

Du solltest Dein Problem noch stärker aufsplitten! In Gedanken machst Du das ja sogar, indem Du sagst: "Nun muss ich noch A, B und C lösen". Ansätze davon hast Du ja schon realisiert. Also schreibe doch erst einmal Funktionen, die eine jede Aufgabe losgelöst erfüllen. Danach rufst Du sie einfach in einer sinnvollen Reihenfolge auf :-)

Dazu solltest Du Dir dringend mal das Tutorial angucken, speziell den Bereich, wo Funktionen erklärt werden (Parameterübergabe und Rückgabewerte!) und dazu noch die grundlegenden Datentypen wie Listen und Tupel.

Also noch mal zusammengefasst:

Du schreibst eine Funktion, die einen Verzeichnispfad als String übergeben bekommt und dann alle Verzeichnisse unterhalb dieses Teilbauemes durchläuft. Gesuchte Dateinamen speicherst Du einfach in eine Liste, die Du am Ende der Funktion zurückgibst.

Du schreibst eine Funktion, die einen Dateinamen und ein Sucwort übergeben bekommt, diese Datei öffnet und die Datei dann nach diesem Suchwort durchstöbert. eine gefundenen Zeilen merkst Du Dir wieder in einer Liste, die Du dann zurückgibst.

Dann schreib eine Funktion, die einen Dateinamen übergeben bekommt und eine Liste von Zeilen. Diese Funktion soll einfach alle Zeilen in eine Textdatei speichern. Sie braucht nichts explizit zurückzuliefern.

ALs letztes brauchst Du noch eine Funktion (z.B. main), die alle bisherigen zusammenschaltet.

Dazu sammelst Du erst einmal alle Dateinamen ein, die in Frage kommen. Dann musst Du diese Liste durchgehen und jede Datei durch die 2. Funktion parsen lassen. Sämtliche Rückgaben vereinigst Du in einer Liste. Als letztes musst Du diese Liste eben noch in eine Datei schreiben lassen, durch Funktion Nummer 3.

Vorteil davon: Du kannst jede einzelne Funktion unabhängig von einander testen (z.B. indem Du fixe Dateinamen oder aber auch kurze von Hand im Programm definierte Listen übergibst) Wenn jede einzelne läuft, ist das "Zusammenschalten" oft sehr einfach :-)

Natürlich ist mein Vorschlag in einigen Bereichen nicht wirklich optimal, aber das hängt natürlich auch von Anforderungen ab, die Du ggf. noch nicht genannt hast :-)

Verfasst: Donnerstag 16. Juli 2009, 09:41
von Knuspersuppe
Ok, erstmal Danke :lol:

Hab mir das ganze etwas einfacher vorgestellt, da die Idee dahinter ja eigentlich garnicht mal so schwer ist.
Werd mal schauen wie ich das jetzt realisiere^^

Verfasst: Donnerstag 16. Juli 2009, 12:57
von Knuspersuppe
Da bin ich wieder,

Bin jetzt eigentlich komplett fertig.
Mein Script öffnet nun das Verzeichnis, alle Daten mit der Endung .a und .b und listet von allen Daten die enthaltenen Texte komplett auf.
Nur mein Problem ist jetzt, dass nur von der letzten gelesenen Datei der Text auch in meinem Textdokument gespeichert wird O_O

Wie kann ich alle Texte der Daten im .txt Dokument abspeichern und nicht nur die der letzten Datei?

Verfasst: Donnerstag 16. Juli 2009, 13:01
von /me
Knuspersuppe hat geschrieben: Mein Script öffnet nun das Verzeichnis, alle Daten mit der Endung .a und .b und listet von allen Daten die enthaltenen Texte komplett auf.
Nur mein Problem ist jetzt, dass nur von der letzten gelesenen Datei der Text auch in meinem Textdokument gespeichert wird O_O

Wie kann ich alle Texte der Daten im .txt Dokument abspeichern und nicht nur die der letzten Datei?
Du hast jetzt leider keinen Beispielcode geliefert.

Ich vermute, dass du die Datei in die du schreibst mehrfach öffnest und schließt und beim Öffnen den falschen Modus verwendest.

Gruß,
Matthias

Verfasst: Donnerstag 16. Juli 2009, 13:04
von Knuspersuppe
Ok, ich nehm die Frage zurück, hat sich erledigt.
Alles funktioniert genau so wie ich es wollte :D

Nochmal Danke an alle!

Re: Spezielle Texte aus einer Textdatei kopieren

Verfasst: Donnerstag 16. Juli 2009, 15:30
von bankkind
Knuspersuppe hat geschrieben: Wie kann ich es also mit Python anstellen, alle Textdateien in diesem Verzeichnis absuchen zu lassen, und dann jede Zeile, in der dieser Begriff vorkommt zu kopieren und in einem Textdokument abzuspeichern?
Ist das nicht grep??

Ich glaube daran versuche ich mich auch mal bei gelegenheit.

Verfasst: Donnerstag 16. Juli 2009, 15:43
von cofi
Ja .. das ist ``grep $pattern > outfile`` wobei fuer Programme ``ack`` vllt besser ist.

@OP: Vielleicht solltest du dir mal die 2 anschauen. Wenn du die aber selbst nachbauen willst ...

Verfasst: Donnerstag 16. Juli 2009, 16:03
von jerch
ack? Oder meinst Du awk?

Verfasst: Donnerstag 16. Juli 2009, 16:17
von cofi
Nein, ich meine ``ack``: http://www.betterthangrep.com/