datei auslesen und in einer dictionary einfügen.

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.
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

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 ?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Wie sieht denn dein Ansatz aus, bzw. was glaubst du was du als nächstes tun solltest?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
/me
User
Beiträge: 3558
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mit split() kannst du Strings auseinandernehmen. Hier bietet sich als Trenner das Komma an.
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

die vokabeln mit splitt(",") zusplitten ,aber dann habe ich ne Liste und nun weiß ich nicht weiter.
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

da wa /me bisschen schneller als ich ;)

weiß trotzdem nicht was ich nun mit der Liste anfangen soll.
Benutzeravatar
snafu
User
Beiträge: 6754
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Zuletzt geändert von snafu am Samstag 17. November 2012, 16:00, insgesamt 1-mal geändert.
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

word, translation, = line.split(',')

das erste Wort vor dem "," wird nun in "word" zugewiesen
und das Wort nach dem "," in translation?
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

mit den Zeilenumbrüche habe ich auch gerade gemerkt =/..
Benutzeravatar
snafu
User
Beiträge: 6754
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
snafu
User
Beiträge: 6754
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. :)
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

@snafu Super !!!!! jetz kann ich weiter machen. meld mich nochmal wenn ich wieder probleme bekomme ;)
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

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!!
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

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.
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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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()
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Evilsadness
User
Beiträge: 29
Registriert: Freitag 2. November 2012, 13:11

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 !!!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
/me
User
Beiträge: 3558
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten