Wort aus Text auslesen.

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.
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

Hallo Leute,
ich habe eine Textdatei und öffne diese mit meinem Pythonprogramm,
diese Textdatei hat nur eine Zeile, doch will ich jetzt ein Wort bzw. eine
Zahl aus dieser Zeile herausnehmen und in eine extra Datei speichern.
Kann man irgendwie angeben der wievielte Buchstabe rausgeschrieben werden soll? Denn ich will natülich eine bestimmte Zahl aus der Textdatei
herausschreiben.
Schon mal vielen Dank. :-)

Viele Grüße
Teabag
ck
User
Beiträge: 11
Registriert: Samstag 10. Mai 2008, 17:44
Kontaktdaten:

Hi,
Probiers mal damit:

Code: Alles auswählen

>>> text = "Hallo"
>>> print text[0]
H
>>> print text[0:3]
Hal
>>> print text[1:4]
all
>>> print text[-1]
o
So gibst du an den/die wievielten Buchstaben du aus einem Text nehmen wilst
Achtung: 0 ist der erste Buchstabe (-1 ist der letzte)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vielleicht noch eine Ergänzung. Vielleicht nicht dir das schon den schwersten Teil der Arbeit ab:

Code: Alles auswählen

>>> "das ist eine zeile mit mehreren woertern".split(" ")
['das', 'ist', 'eine', 'zeile', 'mit', 'mehreren', 'woertern']
Hast du das Tutorial schon durchgearbeitet, dann Frage hört sich noch sehr grundlegend an.

Bis dann.
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

Vielen Dank für eure Hilfe,
jetzt klappts :-)

gruß Teabag
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Ich weiß ned ob ich dafür en Extra-Thread aufmachen soll, aber da das Problem darauf aufbaut hab ichs hier gepostet. Wenns falsch ist Sorry und bitte verschieben :)

Irgendwie will das bei mir mit split nicht ganz... Folgende Situation:

Habe eine Textdatei mit folgendem Inhalt
Erste Zeile
Zweite Zeile
Dritte Zeile
Des Ganze sollte ein Testlauf für ne Art "Datenbank" sein, drum der sinnlose Text. Was ich will ist, dass beides in ein Dictionary kommt, jeweils das erste Wort als Schlüssel und jeweils das Zweite als entsprechender Wert. Also hab ich folgenden Code gebastelt:

Code: Alles auswählen

datei = file('F:\Test.txt','r')
string = datei.readlines()
Wort = string.split(" ")
for z in Word:
    print z
datei.close()
Und da bekomm ich dann folgende Fehlermeldung:

Traceback (most recent call last):
File "E:/Python25/test", line 3, in <module>
Wort = string.split(" ")
AttributeError: 'list' object has no attribute 'split'

Ich weiß (oder besser: ich kann mir denken) das dieser Code für mein Vorhaben wahrscheinlich elends umständlich und kompliziert ist. Ich bin noch ziemlich neu im Programmieren und muss mir des selber beibringen, seit gnädig :D Aber ich weiß nicht wo da mein Fehler liegt. "String" besteht doch aus Strings, ned aus Listen...?!
Achtung, ein n00b! ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Die Methode readlines() liefert nicht eine Zeichenkette, sondern eine LISTE, bei jeder Eintrag einer Zeile der eingelesenen Datei entspricht.
Auch wenn du diese List dann "string" nennst (was eher nicht sinnvoll ist), wird daraus keine Zeichenkette ... :D
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Die hab ich String genannt weil mir auf die Schnelle nihts besseres eingefallen ist ^^

Ok, gibt es denn dann eine Möglichkeit diese Liste als einzelne Strings aufzudröseln oder überhaupt eine andre Möglichkeit die einzelnen Worte da rauszubekommen?
Achtung, ein n00b! ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Sicher gibt es die Möglichkeiten.

Ich empfehle dringend die Lektüre des Tutorials. Da findest du solche Dinge gut erklärt.
ck
User
Beiträge: 11
Registriert: Samstag 10. Mai 2008, 17:44
Kontaktdaten:

Hi
Das problem ist, dass readlines() eine Liste zurückgibt:
["Erste Zeile","Zweite Zeile","Dritte Zeile"]
Um den String herauszubekommen musst du liste[0] in dem Fall string[0] schreiben.
Die Null steht für den ersten Eintrag in der Liste (-1 für den letzten)
Ich würde das so schreiben:

Code: Alles auswählen

datei = file('F:\Test.txt','r')
daten = datei.read() # weil readlines den Zeilenumbruch mitnimmt
datei.close()
liste = daten.split("\n") # das ist der Zeilen umbruch

woerter = liste[0].split(" ")
print woerter[0], "-", woerter[1]

woerter2 = liste[1].split(" ")
print woerter2[0], "-", woerter2[1]

woerter3 = liste[2].split(" ")
print woerter3[0], "-", woerter3[1]
Kan man mit einer Schleife natürlich verbessern:

Code: Alles auswählen

datei = file('F:\Test.txt','r')
daten = datei.read() # weil readlines den Zeilenumbruch mitnimmt
datei.close()
liste = daten.split("\n") # das ist der Zeilen umbruch

for i in range(len(liste)):
    
    woerter = liste[i].split(" ")
    print woerter[0], "-", woerter[1]
ck
User
Beiträge: 11
Registriert: Samstag 10. Mai 2008, 17:44
Kontaktdaten:

ups

Ich hab zum schreiben so lange gebraucht, dass derweil drei Einträge eingetragen wurden!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@ck: In Python kannst du auch direkt über die Elemente einer Liste iterieren, den Umweg über die Indizes kannst du dir sparen:

Code: Alles auswählen

for elem in liste:
    woerter = elem.split(" ")
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Wow, vielen Dank für die schnellen Antworten! :)

@pütone: Ich hatte mit dem Tutorial mal angefangen, bin aber nicht ganz durchgestiegen (wegen der Kombination aus Fachbegriffen und dem für einen damaligen 8-Klässler recht komplexen Englisch) und hab mir dann ein Buch gekauft. Da is die Kapitelreihenfolge n bissl unkonventionell ;)

@ck: Auf deine Idee bin ich auch mal kurz gekommen, hab ich dann aber verworfen, weil das ja dadurch, das man jeden String einzeln anspricht, recht umständlich ist und dachte da gibts bestimmt was praktischeres. Auf die Idee, das in eine Schleife zu packen, bin ich natürlich nicht gekommen ^^

@EyDu: Genau das meinte ich mit praktischer ^^ Danke, das werde ich gleich mal ausprobieren!

EDIT: Habe mich jetzt für ck's Lösung entschieden, das ist für mich leichter nachvollziehbar ;)
Zuletzt geändert von Mycron am Sonntag 11. Mai 2008, 18:28, insgesamt 1-mal geändert.
Achtung, ein n00b! ;)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

fh = open('test.txt', 'r')
try:
    data = [line.split() for line in fh]
    print data
finally:
    fh.close()
Warum denn so umständlich? :D
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Uff! Das ist das was ich am Anfang meinte, eine ultimative einfache Lösung auf nem andren Niveau ^^

Ok, mal sehen ob ich das versteh...
Also erstmal, wieso brauchst du nicht den vollen Pfad angeben, sondern nur den Namen? Warum "open" und nicht "file", gibts da Vorteile? Und Zeile 3 - 6 verstehe ich die Funktion nicht ganz, das is noch zu hoch für mich :D
Vor allem Zeile 4, da wäre ich froh wenn du mir die Funktionsweise mal aufdröseln könntest ^^

Besten Dank

Mycron
Achtung, ein n00b! ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Eine LC ohne Prädikat entspricht übrigens einem "map":

Code: Alles auswählen

import string
with open('test.txt') as fh:
    data = map(string.split, fh)
    print data 
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Danke für die Erläuterung, hab jetzt aber trotzdem schonmal mit dem andren Vorschlag weitergearbeitet ;)

Also, bis jetzt sieht der Code so aus (er funktioniert sogar!!!:D)

Code: Alles auswählen

 datei = file('F:\Test.txt','r')
daten = datei.read() #nimmt den Zeilenumbruch nicht mit
datei.close()
liste = daten.split("\n") # das ist der Zeilen umbruch

for i in range(len(liste)):
   
    woerter = liste[i].split(" - ")

d1 = {woerter[0]:woerter[1]}             #w0 = Interpret / w1 = Titel
d2 = {woerter[1]:woerter[0]}

Check1 = raw_input('Kennen sie den Interpreten? ')
if Check1 == "nein":
     Check2 = raw_input('Kennen sie den Titel? ')
     if Check2 == "ja":
         Suchabfrage1 = raw_input('Wie heisst der Titel? ')
         if d2.has_key(Suchabfrage1):
            print d2[Suchabfrage1]
         else:
            print 'Kein Eintrag!'
     else:
         print 'Error'

elif Check1 == "ja":
    Suchabfrage2 = raw_input('Wie heißt der Interpret? ')  
    if d1.has_key(Suchabfrage2):
         print d1[Suchabfrage2]
    else:
         print 'Kein Eintrag'
Jetzt noch eine Frage, auf die ich in meinem schlauen Buch im dict-Kapitel keine Antwort finde:
Und zwar funktioniert es so lange, bis pro Interpret nur ein Titel in der Test.txt steht. Da ich weiß (!) das man nicht denselben Schlüssel mehrmals ins dict schreiben kann, muss ich das irgenwie umgehen. Meine Idee wären ein paar Zeilen, die beim Hinzufügen von Elementen ins Dictionary schauen, ob der Schlüssel bereits vergeben ist, und wenn ja, das der Wert einfach noch an den entsprechenden Wert angehängt wird.

Wie ich die Abfrage schreiben kann weiß ich schon (mit try und so :)), aber die Frage ist wie ich es schaffe ihm zu sagen, das der Wert hintenangehängt werden soll.
Ok, ich muss es halt der Werteliste für den entsprechenden Key hinzufügen, aber muss ich dann wirkilch jeder einzelnen Werteliste eine Variable zuordnen um das dann mit x.append(y) zu realisieren??
Achtung, ein n00b! ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mycron hat geschrieben:Ich hatte mit dem Tutorial mal angefangen, bin aber nicht ganz durchgestiegen (wegen der Kombination aus Fachbegriffen und dem für einen damaligen 8-Klässler recht komplexen Englisch)
Auch wenn es die aktuellste und umfangreichste Dokumention nur in englischer Sprache gibt, soll es daran allein nicht liegen. Hier ein paar deutschsprachige Einführungen in Python:

Tutorial auf deutsch (etwas alt ..)

A Byte of Python (deutsch)

Wie ein Informatiker denken lernen
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Ui, wahnsinn, vielen Dank!! :D

Übrigens: Als ich gerade wegen dem Problem, was ich im Post vor dir geschildert habe, gesucht habe, kam ich schon auf die Site "Wie ein Informatiker denken lernen" und dachte mir klasse, die hauste mal zu den Lesezeichen ^^
Achtung, ein n00b! ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das mit dem Anhängen ein einen Interpreten ist recht simpel, du muss als Wert nur eine Liste nehmen:

Code: Alles auswählen

the_dicionary.get(the_artist, []).append(new_title)
Schau dir in der Doku mal an, was das "get" macht, dann sollte die Lösung klar sein.
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Hm, also in der Library Reference hab ichs ned gefunden (was mich etwas stutzig macht, vielleicht bin ich zu dumm zum suchen), aber in meinem Buch hier steht etwas, das deinem Codebeispiel recht nahe kommt (allerdings knapp 300 Seiten weiter als ich bis jetzt bin ^^):

get(index1[, index2])

Gibt den Text des Widgets von Position index1 bis einschließl. index2 als String zurück. Falls das zweite Argument weggelassen wird, wird das Zeichen an der Position index1 zurückgegeben.

Ähm... also des steht bei mir unter dem Kapitel "Komplexe Benutzungsoberflächen", daher steige ich nicht ganz hinter die Methode...
Wärst du bereit mir eine kurze Zusammenfassung zu posten? :)
Ich such simultan im Web, aber das klappt eher schlecht als recht :/

Danke!
Mycron
Achtung, ein n00b! ;)
Antworten