aus einem dict ein csv file kreieren

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
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

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.
Zuletzt geändert von peterwoodbridge am Freitag 11. Oktober 2013, 13:30, insgesamt 1-mal geändert.
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.
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

hm danke. aus dem csv hät ich dann mein excel file gemacht...

muss nun schauen was ich machen werde.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

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.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@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.
Das Leben ist wie ein Tennisball.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Stimmt sieht besser und ist kürzer, danke :)
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

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
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.
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

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...
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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.
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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?
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

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 :)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
zikzak
User
Beiträge: 21
Registriert: Sonntag 22. September 2013, 07:28
Wohnort: Sipbachzell, Österreich

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