String splitten (als Suchapplikation für strings in Dateien)

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
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Hallo, ich bin relativ unerfahren was das programmieren angeht und lerne zur Zeit für eine Ausbildungsstelle Python, da mir Grundkenntnisse sehr helfen würden. Ich habe mir ein paar Übungen aus dem internet zusammengesucht und bin nun vor einem Problem: Die Lösung zu der angegebenen Aufgabe war sehr ungenau und ich möchte das genauer gestalten.

Lange Rede, kurzer Sinn:

Ich möchte eine Applikation erstellen die eine Textdatei durchsucht nach einem Suchwort, das der Benutzer eingeben kann. rausgeben soll der dann:

1. wie oft das wort in der datei enthalten ist

2. Die Zeilen ausgeben in denen das Wort vorkommt

Bei mir ist's jetzt nur so, wenn in einer Zeile ein Wort zweimal vorkommen würde, würde die Applikation es nur einmal erkennen. da er nur die Zeilen zählt.

Code: Alles auswählen

file = open('story.txt', 'r')
text = file.readlines()
file.close()


for line in text:
	print line,                             # print text

# count how often the keyword is in the text

keyword = raw_input("Search for a keyword: ") 
count_key = 0                           
for line in text:
	if keyword in line:             
		count_key = count_key + 1       # count keyword
		
print count_key, "matches of the keyword", keyword, "found."


raw_input("Press [ENTER] to continue.")

# print all sentences that include the keyword

print "\nThese lines include the keyword", keyword, ":"

lines = 0                                    # count sentences
for line in text:                                # for every dot. there should be a sentence
    lines = lines + 1
    if keyword in line:                         # print every sentece that includes the keyword
        print lines,":", line 

raw_input("Press [ENTER] to exit.")
könnt ihr mir helfen plz?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Schau mal hier:

Code: Alles auswählen

>>> s = "tach hallo moin tach"
>>> s.count("tach")
2
Da musst du deine Zeilen 14/15 etwas modifizieren.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

ich würde auch nicht zweimal alle Zeilen durchsuchen, sondern in etwa sowas machen (nicht getestet):

Code: Alles auswählen

cnt = 0
matches = list()
for index, line in enumerate(text):
    found = line.count(keyword)
    if found:
        cnt += found
        matches.append((index + 1, line))

for match in matches:
    print '%i: %s' % match
Gruß,
Manuel
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Hmm. danke ich probier's mal eben umzusetzen...
BlackJack

Und wenn man nur einmal über die Zeilen iteriert und die Treffer gleich ausgibt braucht man am Anfang nicht die gesamte Datei in den Speicher lesen, sondern kann während des Einlesens Zeile für Zeile arbeiten. So lassen sich dann auch mehrere Gigabyte grosse Logdateien durchsuchen.

Noch ein Wort zu Kommentaren: Die sollten wenn möglich nicht das offensichtliche nochmal sagen. So etwas wie:

Code: Alles auswählen

counter += 1  # Erhöhe `counter` um eins.
ist total überflüssig. Kommentare sollten in der Regel nicht beschreiben *was* gemacht wird, sondern *warum*. Das *was* steht ja schon in Quelltext da.

Noch schlimmer sind Kommentare die nicht zum Quelltext passen. Im ersten Beitrag die Kommentare in den Zeilen 26 und 27 zum Beispiel: Um welche Sätze und welche Punkte geht es da? Kommentare sollen beim Verstehen helfen und nicht verwirren.
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Also ich kenn mich nicht besonders gut aus:

@rebecca: Ich verstehe deinen Vorschlag und sehe auch das in den zeilen etwas modifiziert werden muss. ich denke das s in meinem fall line sein sollte oder? Ich habe auf jeden fall die auch versucht die operation count (hoffentlich war das jetzt nicht falsch ausgedrückt) in text, und in einer extra variable zu laden aber da gibt er mir dann leider 0 an... das einzige was einwandfrei funktioniert ist der untere teil der mir jede zeile rausschmeißt die das suchwort enthält.

@helduel: Hab's mal ausprobiert. jetzt gibt er mir nicht mehr an wie häufig das keyword enthalten ist, also eigentlich findet er in dem fall nichts.. ich hab das aber leider auch nicht so besonders verstanden.

ein kollege meinte ich sollte mal nach hashes fragen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ungetestet:

Code: Alles auswählen

for line in text:
    count_key += line.count(keyword)
Wobei man sich hier das zeilenweise Durchwandern der Textdatei sparen koennte. Mann koennte die Datei komplett mit read einlesen und auf den gesamten Text count anwenden. Oder, wie BlackJack schon sagte, in diese for-Schleife schon gleich die Ausgabe mit einbauen (dann also doch beim zeilenweisen Durchlaufen bleiben).
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Hm. Also ich hab jetzt alles nochmal durchgeschaut. natürlich geht das ganze dann wesentlich schneller und der text muss nicht ausgegeben werden. allerdings ist das garnicht mein problem gewesen.
Ich habe die kommentare seit letzten bearbeitungen nicht mehr verändert. (ich bin ja noch neuling)

eigentlich ist mein problem, das ich möchte das der zählt wie oft ein bestimmtes keyword im text vorkommt. dads problem ist, das meine applikation mir angibt in wievielen Zeilen das keyword vorkommt, was leider nicht exakt genug ist.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

TEXTiX-X hat geschrieben:@helduel: Hab's mal ausprobiert. jetzt gibt er mir nicht mehr an wie häufig das keyword enthalten ist, also eigentlich findet er in dem fall nichts.. ich hab das aber leider auch nicht so besonders verstanden.
Gibt er keine Zeilen aus?

Die Gesamtzahl der Treffer wird in meinem Beispiel nicht ausgegeben, aber das kannst durch ein simples 'print cnt' erreichen.

Was genau verstehst du nicht?

Gruß,
Manuel
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Hab's jetzt mittlerweile verstanden:

Also deinen Code, habe deinen Code genommen und print cnt reingeschoben damit er mir das ausgibt was ich will. jetzt ist mein unterer Teil sinnlos. aber dann funktioniert's. hab schon neue ansätze um die applikation zu erweitern.

Danke auf jeden fall für die nette und schnelle Hilfe.

kann also geclosed werden...
Antworten