Seite 1 von 2

datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 15:32
von Evilsadness
vorweg, ich bin noch so ziemlich ein Anfänger in python und habe ein Problem.

ich übe gerade mit "dictionary".
erstellen und key/value hinzufügen kann ich eig., sowie andere methoden.

ich habe ein Programm geschrieben, dass ein Wörterbuch hat mit englischen und deutschen Vokabeln.
Wenn ich das Programm starte werde ich gefragt, ob ich ne neue Vokabel hinzufügen will oder ob ich eine bestimme Vokabel wissen will. Damit habe ich keine Probleme. Jedoch wenn ich zum Beispiel eine neue Vokabel reinschreibe wird die neue Vokabel ja beim beenden wieder aus dem Wörterbuch gelöscht.

Ich habe mir jetzt dazu eine csv datei erstellt mit jetzt erst 3 Wörtern:

Germany,Deutschland
book,Buch
picture,Bild

Ich lese jetzt am Anfang die Datei aus :

Code: Alles auswählen

datei = open ("vokabeln.csv", "r")

for line in datei:
    print(line)

wie bekommen ich jetzt diese wörter in einer dictionary ?

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 15:36
von jbs
Wie sieht denn dein Ansatz aus, bzw. was glaubst du was du als nächstes tun solltest?

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 15:36
von /me
Mit split() kannst du Strings auseinandernehmen. Hier bietet sich als Trenner das Komma an.

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 15:39
von Evilsadness
die vokabeln mit splitt(",") zusplitten ,aber dann habe ich ne Liste und nun weiß ich nicht weiter.

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 15:40
von Evilsadness
da wa /me bisschen schneller als ich ;)

weiß trotzdem nicht was ich nun mit der Liste anfangen soll.

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 15:49
von snafu
Du brauchst eine Schleife. Mal die anfängerfreundliche Variante (ungetestet):

Code: Alles auswählen

translations = {}
with open('vokabeln.csv') as f:
    for line in f:
        word, translation = line.split(',')
        translations[word] = translation
Du kannst die 2-elementrige Ergebnisliste also, wie gezeigt, auseinandernehmen. Nennt sich Unpacking.

Obiges geht aber auch kürzer:

Code: Alles auswählen

dict(line.split(',') for line in f)
Dummerweise sind dann immer noch Zeilenumbrüche drin... :o

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 15:59
von Evilsadness
word, translation, = line.split(',')

das erste Wort vor dem "," wird nun in "word" zugewiesen
und das Wort nach dem "," in translation?

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 16:02
von Evilsadness
mit den Zeilenumbrüche habe ich auch gerade gemerkt =/..

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 16:03
von snafu
Evilsadness hat geschrieben:word, translation, = line.split(',')

das erste Wort vor dem "," wird nun in "word" zugewiesen
und das Wort nach dem "," in translation?
Richtig. Wobei bei diesem Unpacking egal ist, woher die Liste kam. Wenn du 2 Elemente hast, dann wird der erste Name an das erste Element und der zweite Name an das zweite Element gebunden. Geht natürlich auch mit einer höheren Anzahl an Elementen. Es müssen nur exakt soviele Namen wie Elemente sein, sonst wirft Python nen Fehler.

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 16:04
von snafu
Evilsadness hat geschrieben:mit den Zeilenumbrüche habe ich auch gerade gemerkt =/..
Dafür gibt es `.strip()`, welches eine Methode von String-Objekten ist und Whitespace, wie z.B. Zeilenumbrüche, am Anfang und am Ende eines Strings entfernt. Also wie für dich gemacht. :)

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 16:12
von Evilsadness
@snafu Super !!!!! jetz kann ich weiter machen. meld mich nochmal wenn ich wieder probleme bekomme ;)

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 17:02
von Evilsadness
da bin ich wieder ;D

Nur noch der Schluss fehlt.
habe nun im Programm neue Vokabeln hinzugefügt.
Wie kann ich nun das Wörterbuch mit den neuen werden so in der csv Datei wieder reinschreiben, dass Sie beim nächsten ausführen die neuen Vokabeln beinhaltet?

Code: Alles auswählen

datei = open("vokabeln.csv", "a")
so würde ich die Datei zum Schluss meines Programmes öffnen.
Habe aber keinerlei Idee wie ich nun den Key als erstes ausgebe und dann ein "," und dann den passende "value" und dann ein Zeilenumbruch. und das alles in einer Schleife.

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 17:10
von jbs
Es stellt sich die Frage, ob es nicht klüger ist, die Datei zu überschreiben (Modus 'w'). Somit stellst du sicher, dass es nur ein Schlüssel-Wert-Paar gibt.

Ehrlich gesagt, habe ich keine Lust dir die Lösung zu verraten. Arbeite doch bitte entweder das Tutorial durch oder befrag google. Und wenn du dann immer noch nicht weiter kommst, dann poste bitte das, was du bisher hast und schreib dazu, was da nicht klappt.


http://lmgtfy.com/?q=python%20for%20dictionary

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 18:18
von Evilsadness
Ich versuche es und bekomme ist nicht hin. Es ist ja nicht so, dass ich einfach hier was schreibe und warte bis die passende Antwort kommt.
ich google und finde nichts passendes was ich suche.

was ich bisher versucht habe war, die key und value zutrennen:

Code: Alles auswählen

datei = open("vokabeln - Kopie.csv", "w")

key = vokabeln.keys()
value = vokabeln.values()
nun habe ich die beiden getrennt, weiß aber nicht wie ich die nun abwechseln in einer Schleife abspeichern soll. Vielleicht ist auch diese Idee doof und es lohnt sich viel eher die dictionary zu splitten und die key und value zeilenweise abspeichern,aber dann müsste ich die ":" durch "," wieder ersetzen und dazu hätte ich auchkeine Idee und finde auchnichts dazu..

Ich erwarte auch keine vollständige antworten von euch, ledlich Ideen wie man das umsetzten kann.

Vielen dank im Vorraus!!

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 18:37
von Evilsadness
habe jetzt die keys und value in der csv datei mit ":" getrennt und habe esbeim auslesen mit .splitt(":") getrennt.

jetzt mussich nur noch wieder die keys und values vom wörterbuch also z.b:

Code: Alles auswählen

{'picture': 'Bild', 'book': 'Buch', 'Germany': 'Deutschland'}
mit .splitt(",") trennen.

Aber wie ich das genau schaffe weiß ich nicht.

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 18:52
von BlackJack
@Evilsadness: Diese Beschreibung macht keinen Sinn. Entweder sind die Felder mit ':' getrennt oder mit ','. Sollte das was Du da im Code-Block gezeigt hast, also wahrscheinlich das Ergebnis von ``str(vokabeln)``, in der Datei stehen, dann ist das keine CSV-Datei. Und so etwas solltest Du auch nicht machen, denn die Zeichenkettendarstellung von Wörterbüchern ist nicht unbedingt zum Speichern gedacht, weil es mit einlesen und einfachem aufteilen an ':' und ',' nicht getan ist. Wenn Du so etwas ähnliches Speichern und auch wieder laden möchtest, dann verwende das `json`-Modul. Aber schreibe so etwas nicht selbst — insbesondere nicht als Anfänger.

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 19:36
von jbs
Zumindest bei mir kommt als erster Link bei der Suche: http://www.python-kurs.eu/dictionaries.php
Dort wird beschrieben, wie man über ein Dictionary iteriert:

Code: Alles auswählen

for key in d:
	print d[key]
Alternativ kannst du auch

Code: Alles auswählen

for key, value in d.items():
    print key, value
verwenden.


Mal als Template:

Code: Alles auswählen

def make_line(key, value):
    '''
    >>> make_line('world', 'World')
    'world,World\n'
    ''' 
    return #your job

out = open("vokabeln - Kopie.csv", "w")
for key, value in words.items():
    out.write(make_line(key, value))

out.close()

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 21:21
von Evilsadness
die beispiele wie man iteriert habe ich schon so angewendet. wusste jedoch nicht, dass man 2 werte gleichzeitig in einer for-schleide durchlaufen lassen kann:

Code: Alles auswählen

for key, value in d.items():
    print key, value
Habs jetzt fertig bekommen!!
Dank dieser Schleife ;D

Für vielen ist alles selbstverständlich, jedoch befasse ich mit mit Python erst seit 1 Monat parallel zu XML und Java.
So kommen kleinste Sachen wie nichts vor, doch für mich ist das nicht so selbstverständlich.

Auf jeden Fall !!! Vielen dank !!!

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Samstag 17. November 2012, 22:09
von jbs
Einmal fängt man immer an.

Wenn du magst, kannst du ja mal deinen Code zeigen, um Feedback zu bekommen, was man da besser machen könnte. Das ist meistens sehr lehrreich.

Edit: Zu der Schleife

Was ``items`` wirklich zurückgibt ist eine Liste von Tupeln. Zudem erlaubt es Python bei Collections wie Listen, Tupeln aber auch Mengen diese auszupacken und direkt Variablen zuzuweisen. Das ist vor allem bei Tupeln sinnvoll, klappt aber wie gesagt bei allen Typen, die iterierbar sind.

Code: Alles auswählen

x = ('world', 'Welt')
key, value = ('world', 'Welt')
key, value = x
a,b,c = {1, 2, 3} #no order

Re: datei auslesen und in einer dictionary einfügen.

Verfasst: Sonntag 18. November 2012, 12:00
von /me
Evilsadness hat geschrieben:was ich bisher versucht habe war, die key und value zutrennen:
Und genau das willst du doch eigentlich nicht. Du möchtest die einzelnen Einträge im Dictionary ja schon gemeinsam haben um sie gemeinsam wegschreiben zu können. Du hast keys gefunden, du hast values gefunden - items hast du übersehen.

Code: Alles auswählen

for key, value in vokabeln.iteritems():
    print key, value
Da items eine zusätzlich eine Liste aufbaut, die hier gar nicht benötigt wird, kann man es dann noch prima durch iteritems ersetzen.