Seite 1 von 1

Geöffnete Dateien durchsuchen

Verfasst: Donnerstag 18. Januar 2007, 17:46
von Samiel
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

Re: Geöffnete Dateien durchsuchen

Verfasst: Donnerstag 18. Januar 2007, 18:00
von gerold
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
:-)

Verfasst: Donnerstag 18. Januar 2007, 18:17
von Samiel
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.

Verfasst: Donnerstag 18. Januar 2007, 18:30
von BlackJack
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()

Verfasst: Donnerstag 18. Januar 2007, 18:35
von EyDu
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()

Verfasst: Freitag 19. Januar 2007, 19:41
von Joghurt
@EyDu: grep kann auch direkt Dateinamen bekommen.

Verfasst: Freitag 19. Januar 2007, 20:43
von Leonidas
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

Verfasst: Freitag 19. Januar 2007, 20:56
von Joghurt
Oder noch besser tac dazwischenwerfen:

Code: Alles auswählen

cat foo | tac | cat | tac | tac | tac | cat | grep bar

Verfasst: Freitag 19. Januar 2007, 21:00
von EyDu
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.

Verfasst: Freitag 19. Januar 2007, 21:17
von Luzandro
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 ;) )

Verfasst: Freitag 2. März 2007, 12:31
von dieter1a
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

Verfasst: Freitag 2. März 2007, 21:24
von BlackJack
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.

Verfasst: Freitag 2. März 2007, 23:32
von PmanX
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: Alles auswählen

grep suchwort *.gp[34]

Verfasst: Samstag 3. März 2007, 08:00
von nkoehring
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.

Verfasst: Samstag 3. März 2007, 10:10
von BlackJack
Gut das Du "optimalste" in Anführungszeichen gesetzt hast, das Wort gibt's nämlich nicht. ;-)