Seite 1 von 1

aus einem dict ein csv file kreieren

Verfasst: Freitag 11. Oktober 2013, 11:10
von peterwoodbridge
Hallo zusammen

steh wiedermal auf dem schlauch. habe ein dict, welches folgendes format hat:

Code: Alles auswählen

{person1: [value1, value2], person2: [value3, value4]}
nun möchte ich dies in einem "leserlichen" file haben, zB csv. welche funktion muss ich anwenden, damit jeder key/value eintrag eine reihe generiert in einem csv file?
die liste mit den values (1, 2 etc) sollten dabei jeweils in einer einzelnen zelle stehen.

geht das überhaupt :roll: ?

besten dank.
peterw.

Re: aus einem dict ein csv file kreieren

Verfasst: Freitag 11. Oktober 2013, 11:25
von BlackJack
@peterwoodbridge: In der Standardbibliothek gibt es für CSV-Dateien das `csv`-Modul. Das erwartet eine Sequenz mit den Zellen einer Zeile pro Zeile die geschrieben werden soll. Du musst die Daten halt so aufbereiten. Das ist wohl weniger eine Frage einer speziellen Funktion sondern des Codes den Du schreiben musst, der halt die Daten von der einen Form in die andere bringen muss. Da gibt es mehrere Möglichkeiten das zu machen, wobei ich Deine Beschreibung komisch finde: die Werte zu einem Schlüssel in einer *Zelle*? Da eine Zelle nur einen Wert enthalten kann, müsstest Du die Liste dann irgendwie in *eine* Zeichenkette umwandeln. Nur bekommt man die dann ja vom CSV-Modul nicht automatisch getrennt, weil es eben zu *einem* Wert wird. Man müsste beim lesen/weiterverarbeiten also die Zellenwerte auch noch mal wieder irgendwie parsen.

Re: aus einem dict ein csv file kreieren

Verfasst: Freitag 11. Oktober 2013, 13:33
von peterwoodbridge
hm danke. aus dem csv hät ich dann mein excel file gemacht...

muss nun schauen was ich machen werde.

Re: aus einem dict ein csv file kreieren

Verfasst: Freitag 11. Oktober 2013, 15:01
von Hellstorm
Du kannst doch notfalls einfach das Schlüssel-Wert-Paar vorher in einen String im gewünschten Format speichern und dann in eine neue Liste speichern. Anschließend dann das csv-Modul benutzen.

Sollte nicht allzu komplex sein. Das csv-Modul ist wirklich kinderleicht.

Re: aus einem dict ein csv file kreieren

Verfasst: Samstag 12. Oktober 2013, 03:17
von Dami123

Code: Alles auswählen

import csv
#schreiben
with open("file", "w") as db:
        db = csv.writer(db)
        for key, val in self.database.items():
            db.writerow([key, val])

#lesen
with open("file", "r") as db:
        for key, value in csv.reader(db):
            self.database[key] = value

Re: aus einem dict ein csv file kreieren

Verfasst: Samstag 12. Oktober 2013, 09:14
von EyDu
@Dami123: statt ``writerow`` solltest du hier besser ``writerows`` verwenden. Das Lesen ginge in diesem Fall auch einfacher:

Code: Alles auswählen

with open(filname, "rb") as fp:
    return dict(csv.reader(fp))
Unter Python 2.x sollte die Datei im binary-Modus geöffnet werden und nicht als Text.

Re: aus einem dict ein csv file kreieren

Verfasst: Samstag 12. Oktober 2013, 22:47
von Dami123
Stimmt sieht besser und ist kürzer, danke :)

Re: aus einem dict ein csv file kreieren

Verfasst: Dienstag 29. Oktober 2013, 15:41
von peterwoodbridge
ich habs versucht aber es klappt nicht.

Code: Alles auswählen

{'Ament AG': ['http://www.ament.bla/', 3, 'info@blabla.bla', '0049 xx xx', 'Muenchen'], 'AAG': ['http://aag.blabla.com', 3, 'x', '0049x xx xx', 'Berlin']
Ich muss für meinen Boss nun ein Excel vorbereiten, so dass er schön ablesen kann, welche Firma es ist, wie die Internetadresse lautet, dann ein Kürzel, ob es ein Lieferant oder Kunde oder potentieller Neukunde ist, dann folgt ein Name oder EMAIL, dann eine Telnummer und am Ende noch der Ort). Falls ein "x" steht, bedeutet dies, dass weder Email noch Name gefunden wurde

Ich wäre äusserst dankbar, wenn einer den entscheidenden Input geben kann :) :K

Re: aus einem dict ein csv file kreieren

Verfasst: Dienstag 29. Oktober 2013, 16:20
von BlackJack
@peterwoodbridge: Du möchtest offenbar aus jedem Schlüssel/Wert-Paar *eine* Liste erstellen die als erstes Element den Schlüssel und als restliche Elemente die Elemente des Wertes enthält. Das zusammen ist eine Zeile und kann dann mit dem `csv`-Modul einfach als Zeile gespeichert werden. Eventuell möchtest Du die Zeilen oder auch schon die Schlüssel/Wert-Paare aus dem Wörterbuch sortieren, damit man sich in der Zieldatei leichter zurecht findet.

Re: aus einem dict ein csv file kreieren

Verfasst: Dienstag 29. Oktober 2013, 17:05
von peterwoodbridge
also ich möchte am ende einfach ein excel file haben, wo dann in Spalte A der Name steht, in Spalte B die Internetadresse, in C der Name/Email, dann in D die Telefonnummer und in E der Ort...

Re: aus einem dict ein csv file kreieren

Verfasst: Dienstag 29. Oktober 2013, 17:34
von sparrow
Du kennst .items() auf dicts? Das wäre ein möglicher Ansatz um an die Daten zu kommen:

Code: Alles auswählen

>>> entries = {'Ament AG': ['http://www.ament.bla/', 3, 'info@blabla.bla', '0049 xx xx', 'Muenchen'], 'AAG': ['http://aag.blabla.com', 3, 'x', '0049x xx xx', 'Berlin']}
>>> for name, values in entries.items():
	print name, values

	
AAG ['http://aag.blabla.com', 3, 'x', '0049x xx xx', 'Berlin']
Ament AG ['http://www.ament.bla/', 3, 'info@blabla.bla', '0049 xx xx', 'Muenchen']
Dann musst du das nur noch für deine Ausgabe zusammenbauen.

Re: aus einem dict ein csv file kreieren

Verfasst: Dienstag 29. Oktober 2013, 17:41
von peterwoodbridge
ich geb auf. ich versteh's einfach nicht :?: ... bin wohl nicht der geborene programmierer (ok das wusste ich vorher schon)

im csv modul weiss ich nicht mal, was ich "lesen" muss, in welchem format

Re: aus einem dict ein csv file kreieren

Verfasst: Dienstag 29. Oktober 2013, 18:02
von sparrow
So, erstmal. Wenn du Python 2.7 verwendest, dann ist das hier die richtige Dokumentation. Darunter findest du auch .writer(), was sich doch sehr nach dem Schreiben von etwas anhört. Dort gibt es auch ein Beispiel.

Was du also an die Funktion verfüttern musst, ist eine Liste von Dingen, wobei jeder Teil der Liste eine "Spalte in der Tabelle" repräsentiert. Du musst jetzt also eine Liste in der folgenden Form bauen:

Code: Alles auswählen

['Ament AG', 'http://www.ament.bla/', 3, 'info@blabla.bla', '0049 xx xx', 'Muenchen']
, damit das csv-Modul dir dann das umbauen in CSV abnehmen kann.

So, woran genau scheitert es denn?

Re: aus einem dict ein csv file kreieren

Verfasst: Donnerstag 31. Oktober 2013, 16:58
von peterwoodbridge
ich habs nun über x umwege gemacht und es klappt:

habe eine liste von listen generiert und nachher ein pandas dataframe gebildet. dort gibts die funktion to_csv

danke an alle, die mich aufgemuntert haben, nicht aufzugeben :)

Re: aus einem dict ein csv file kreieren

Verfasst: Donnerstag 31. Oktober 2013, 18:17
von Sirius3
für die, die's direkt mögen:

Code: Alles auswählen

import csv

entries = {'Ament AG': ['http://www.ament.bla/', 3, 'info@blabla.bla', '0049 xx xx', 'Muenchen'],
           'AAG': ['http://aag.blabla.com', 3, 'x', '0049x xx xx', 'Berlin']}

with open("daten.csv", "wb") as db:
    csv_writer = csv.writer(db)
    csv_writer.writerows([key]+val for key, val in entries.iteritems())

with open("daten.csv", "rb") as db:
    csv_reader = csv.reader(db)
    entries = dict((val[0], val[1:]) for val in csv_reader)

Re: aus einem dict ein csv file kreieren

Verfasst: Donnerstag 31. Oktober 2013, 19:34
von zikzak
Servus peterwoodbridge,

zufällig habe ich die halbe letzte Nacht mit solchen Operationen verbracht - leider.
Mit:

Code: Alles auswählen

def writecsv (datei, daten):
    with open (datei, 'w',encoding='cp1252') as csvfile:
        writer = csv.writer(csvfile, delimiter = ';',quoting=csv.QUOTE_ALL,lineterminator='\n')
        writer.writerows(daten)
wobei daten einfach eine Liste von String-Listen darstellt.
Ich habe also die erste Zeile, welche die Spaltennamen darstellen in folgender Form vorgelegt:

Code: Alles auswählen

[ ["vkgrp", "name_vkgrp", "ag", "we","re", "Name 1","Name 2", "Anrede AP", "Titel AP", "Vorname AP",
                             "Name1 AP","E Mail Adresse AP","Telefon-1",
                             "Telefon AP", "Straße", "Postleitz.","Ort"] ]
Jede weitere Zeile einfach mit append angehängt und später dann mit der Funktion writecsv geschrieben.
Es gibt natürlich auch den dictwriter laut Doku, so aber ist es sehr verständlich.