Spezielle Texte aus einer Textdatei kopieren

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.
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

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...)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

os.walk, os.path.splitext, readlines

diese Stichworte solten eigentlich reichen...
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

1) Python 2.6 installieren
2) Lesen: http://docs.python.org/tutorial/index.html
3) Nachschlagen: http://docs.python.org/lib/lib.html
Bottle: Micro Web Framework + Development Blog
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Ok, vielen Dank :D
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? ;)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

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()
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

_Verstehen_ des Tutorials. Da wird von so etwas wie "Funktionen" und "Schleifen" gesprochen, damit man Code nicht kopieren muss. Alles andere wurde schon genannt.
Das Leben ist wie ein Tennisball.
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.
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

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()

Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

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^^
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

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?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
Knuspersuppe
User
Beiträge: 17
Registriert: Dienstag 14. Juli 2009, 16:51

Ok, ich nehm die Frage zurück, hat sich erledigt.
Alles funktioniert genau so wie ich es wollte :D

Nochmal Danke an alle!
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

ack? Oder meinst Du awk?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, ich meine ``ack``: http://www.betterthangrep.com/
Antworten