Geöffnete Dateien durchsuchen

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.
Samiel
User
Beiträge: 6
Registriert: Freitag 1. Dezember 2006, 22:42
Kontaktdaten:

Geöffnete Dateien durchsuchen

Beitragvon Samiel » Donnerstag 18. Januar 2007, 17:46

Ich hab da mal ne Frage,
und zwar versuche ich schon eine Zeit lang ein Script zu schreiben, mit welchem ich meine Tablisten nach einem Begriff durchsuchen kann und des mir dann einträge mit dem gesuchten Begriff ausgibt.

ich bin bis etz soweit:

Code: Alles auswählen

#!/usr/bin/python

tabs = open("/home/samiel/tablist", "r")


blos mir fällt nichts ein wie ich das mit dem Durchsuchen machen könnte, darum wollte ich einfach mal fragen, ob ihr mir da mal nen Tip oder Hilfe geben könntet
Ohne Wissen ist das Leben nur ein Schatten vom Tod
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Geöffnete Dateien durchsuchen

Beitragvon gerold » Donnerstag 18. Januar 2007, 18:00

Samiel hat geschrieben:meine Tablisten nach einem Begriff durchsuchen kann

Hi Samiel!

Willkommen im Python-Forum!

Hier hast du mal Lesestoff, der dich über das Lesen und Schreiben in Dateien aufklärt:
http://www.python-forum.de/topic-6157.html

Und was dein Problem betrifft:
Ich würde Zeile für Zeile durch die Textdatei laufen und prüfen ob in der Zeile der Suchbegriff vorkommt. Wenn Ja, dann könntest du die Zeile ausgeben.

Alles andere ist Spekulation, da ich ja nicht weiß, wie deine Tablisten aufgebaut sind. Was sind überhaupt Tablisten?

Wie auch immer... mit

Code: Alles auswählen

from glob import glob
filelist = glob("pfad zu den Tablisten")
bekommst du eine Liste mit den Dateien eines Ordners zurück. Diese Liste kannst du dann durchlaufen und jede Datei einzeln öffnen und diese nach dem Suchbegriff durchforsten.

Nähere Informationen gibt es dann, wenn du uns erklärst, was Tablisten sind, wie diese aufgebaut sind, nach was du suchen willst und was du mit der Info anfangen willst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Samiel
User
Beiträge: 6
Registriert: Freitag 1. Dezember 2006, 22:42
Kontaktdaten:

Beitragvon Samiel » Donnerstag 18. Januar 2007, 18:17

Schon mal danke für den link^^

Also zu der Liste:
Mit Tabs mein ich Gitarrentabulaturen, Dateien für Guitar Pro, welche anzeigen, wie ein Lied gespielt werden muss.

Und ich hab mit ls -R /ordner/ >> tablist eine Datei erstellt, in der alle *.gp3/*.gp4 (also die Guitar Pro Dateien) namentlich aufgelistet sind.
Also mal so als kleines Beispiel:

./Guitar Pro Tabs/M/Metallica:
Metallica - (ANESTHESIA) Pulling Teeth.gp3
Metallica - ... And Justice Medley.gp3
Metallica - ...And Justice For All (2).gp3
Metallica - ...And Justice For All.gp4

Es is also ne Textdatei, und die wollte ich jetzt mit dem script nach nem bestimmten keyword durchsuchen, und des sollte mir dann alle Zeilen wo des vorkommt ausgeben.
Das könnte ich zwar auch per bash mit "cat tablist | grep *keyword*" machen, aber da ich mit Python angefangen habe wollte ich schauen ob ich des ned irgendwie in ein Script fassen kann.
Und da fällt mir irgendwie nichts ein wie ich die Suche scripten könnte.
Ohne Wissen ist das Leben nur ein Schatten vom Tod
BlackJack

Beitragvon BlackJack » Donnerstag 18. Januar 2007, 18:30

Minimallösung:

Code: Alles auswählen

def main():
    tabs = open('/home/samiel/tablist', 'r')
    for line in tabs:
        if 'keyword' in line:
            print line
    tabs.close()

if __name__ == '__main__':
    main()
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Donnerstag 18. Januar 2007, 18:35

Ich hätte da noch einen nicht ganz ernst gemeinten Vorschlag. Aber die Lösung liegt eben auf der Hand:

Code: Alles auswählen

import os
def search(keyword):
        return os.popen("cat tablist | grep %s" % keyword).read()
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Freitag 19. Januar 2007, 19:41

@EyDu: grep kann auch direkt Dateinamen bekommen.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 19. Januar 2007, 20:43

Joghurt hat geschrieben:@EyDu: grep kann auch direkt Dateinamen bekommen.

Useless use of cat, immerhin. Ganz fein ist aber auch ein Katzenschwanz: echo cat | cat | cat | grep cat
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Freitag 19. Januar 2007, 20:56

Oder noch besser tac dazwischenwerfen:

Code: Alles auswählen

cat foo | tac | cat | tac | tac | tac | cat | grep bar
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Freitag 19. Januar 2007, 21:00

Leonidas hat geschrieben:
Joghurt hat geschrieben:@EyDu: grep kann auch direkt Dateinamen bekommen.

Useless use of cat


Ich hab' doch keine Ahnung von grep ;-) Samiel hatte es nur in seinem zweiten Post stehen.
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

Beitragvon Luzandro » Freitag 19. Januar 2007, 21:17

EyDu hat geschrieben:Ich hab' doch keine Ahnung von grep ;-)


Ist nicht nur bei grep so - ich nehme an ein ziemlich großer Teil der cat-Aufrufe ist ein unnötiger "Mißbrauch" des Tools (ich mache es aber dennoch auch oft ;) )
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Freitag 2. März 2007, 12:31

Das hier funktioniert eigentlich prima.

Code: Alles auswählen

# robot.py


from os import *
from os.path import *

class suchRobot:
   def __init__(self, suchwort, wurzel):
      self.ergebnis = []
      self.suchwort = suchwort
      self.wurzel = wurzel

   def suche(self, suchwort, verzeichnis, dateien):      #Suche nach Dateien, die das Suchwort enthalten
      chdir(verzeichnis)
      for datei in dateien:
         if isfile(datei):
            f = file(datei, 'r')
            text = f.read()
            f.close()
            n = text.count(suchwort)
            if n > 0:
               pfad = normcase(join(verzeichnis, datei))
               self.ergebnis += [(n, pfad)]
               
   def durchsuche(self):
      walk(self.wurzel, self.suche, self.suchwort)
      
   def __str__(self):
      ausgabe = 'suchergebnis:\n'
      self.ergebnis.sort()
      self.ergebnis.reverse()
      for (n, datei) in self.ergebnis:
         ausgabe += '%s(%i Vorkommen von %s)'%(datei, n, self.suchwort)
         ausgabe += '\n'
      return ausgabe
      
      
# Hauptprogramm

bot = suchRobot('robot', 'c:\\python23')
bot.durchsuche()
print bot
BlackJack

Beitragvon BlackJack » Freitag 2. März 2007, 21:24

IIiiiih Sternchen-Imports! Böse!

`chdir()` und `os.walk` vertragen sich nicht wirklich. Wenn ich raten müsste funktioniert das im Beispiel weil die Wurzel ein absolutes Verzeichnis ist.

Man sollte sicherstellen, dass keine DVD-Images auf dem Weg liegen. ;-)

Statt ``+=`` bei der Liste wäre `append()` gebräuchlicher und man braucht keine unnötige Liste mit dem Tupel.

Mit `self.ergebnis.sort(reverse=True)` spart man den extra Aufruf von der `reverse()`-Methode.

Zeichenketten wiederholt mit ``+=`` zusammenfügen kann langsam werden, weil jedesmal eine etwas längerer Zeichenkette als Zwischenergebnis entsteht, die kopiert werden muss. Üblicherweise sammelt man die Teile in einer Liste, die man am Ende mit `str.join()`-Methode zusammenfügt.
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Beitragvon PmanX » Freitag 2. März 2007, 23:32

Anfängerübung :)

Code: Alles auswählen

from sys import argv
from glob import glob

if len(argv) > 2:
        myglob = argv[2]
else:
        myglob = '*.gp[34]'

filelist = glob(myglob)
for f in filelist:
    try:
        fh = open(f)
        for line in fh:
            if argv[1] in line:
                    print f + ': ' + line,
        fh.close()
    except IOError, (errno, strerror):
        print "!! I/O error(%s): %s %s" % (errno, f, strerror)

oder[code=]grep suchwort *.gp[34][/code]
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Samstag 3. März 2007, 08:00

PmanX's Loesung sollte die ehm... "optimalste" sein... in der du nichtmal die Tablisten-Datei anlegen brauchst. Das alles natuerlich vorausgesetzt du suchst wirklich innerhalb der *.gp[34]-Dateien nach deinem Suchwort.
BlackJack

Beitragvon BlackJack » Samstag 3. März 2007, 10:10

Gut das Du "optimalste" in Anführungszeichen gesetzt hast, das Wort gibt's nämlich nicht. ;-)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder