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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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:

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

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: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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()
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

@EyDu: grep kann auch direkt Dateinamen bekommen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Oder noch besser tac dazwischenwerfen:

Code: Alles auswählen

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

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

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 ;) )
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

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

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:

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]
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
BlackJack

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