csv.writer sperariert jedes char eines strings?

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
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hi,

Code: Alles auswählen

import csv as csv

Name = ["Lesson1", "Lesson2"]
Deutsch = ["Gut", "Hallo", "Fenster"]
Englisch = ["good", "hello", "window"]

All = []
All.append(Name)
All.append(Deutsch)
All.append(Englisch)

with open('test.csv', mode='w') as test_file:
    vokwriter = csv.writer(test_file, quoting=csv.QUOTE_MINIMAL)
    vokwriter.writerow(All[0][0])
    vokwriter.writerow(All[1])
    vokwriter.writerow(All[2])
    
Was ich erwarte ist:
Lesson1
Gut,Hallo,Fenster
good,hello,window
Was ich erhalte ist:
L,e,s,s,o,n,1
Gut,Hallo,Fenster
good,hello,window
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Na, dann mach aus dem All[0][0] mal besser ein All[0]...
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`writerow` erwartet etwas iterierbares. Hast du bei `All[1]` und `All[2]`, nämlich eine Liste. `All[0][0]` ist ein String - und wenn man darüber iteriert bekommt man die einzelnen Zeichen / Buchstaben.
Lesson 1 wäre vielleicht auch besser der Name der CSV-Datei als eine Art "Überschrift" in der Datei. Wenn du so was brauchst wäre JSON IMHO die bessere Datenstruktur. Da wäre dann jede Lesson ein Schlüssel.

`import csv as csv` ist sinnfrei, weil das das gleiche bewirkt wie das einfache `import csv`.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Anordnung der Daten ist auch ein bisschen ungewöhnlich. Üblicher wäre eine Spalte für jede Sprache und keine Zeile.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das Schreiben kann man eigentlich in einem Rutsch abwickeln:

Code: Alles auswählen

writer.writerows(zip(deutsch, englisch))
Auch empfiehlt sich der Einsatz eines Wörterbuchs:

Code: Alles auswählen

translations = {'Hallo': 'Hello', 'Apfel': 'Apple'}
...
writer.writerows(translations.items())
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

snafu hat geschrieben: Donnerstag 30. August 2018, 12:30 Na, dann mach aus dem All[0][0] mal besser ein All[0]...
Dann bekomme ich aber "Lesson1, Lesson2" ausgegeben. Das möchte ich nicht.

__blackjack__ hat geschrieben: Donnerstag 30. August 2018, 13:54 Die Anordnung der Daten ist auch ein bisschen ungewöhnlich. Üblicher wäre eine Spalte für jede Sprache und keine Zeile.
Aber wie soll das ergonomisch funktionieren? gibt es einen Befehl writecolumn?

noisefloor hat geschrieben: Donnerstag 30. August 2018, 12:33 Hallo,

`writerow` erwartet etwas iterierbares. Hast du bei `All[1]` und `All[2]`, nämlich eine Liste. `All[0][0]` ist ein String - und wenn man darüber iteriert bekommt man die einzelnen Zeichen / Buchstaben.
Lesson 1 wäre vielleicht auch besser der Name der CSV-Datei als eine Art "Überschrift" in der Datei. Wenn du so was brauchst wäre JSON IMHO die bessere Datenstruktur. Da wäre dann jede Lesson ein Schlüssel.

`import csv as csv` ist sinnfrei, weil das das gleiche bewirkt wie das einfache `import csv`.

Gruß, noisefloor
Kann man JSON auch in eine Textdatei schreiben?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

naheliegend hat geschrieben: Donnerstag 30. August 2018, 17:06 Dann bekomme ich aber "Lesson1, Lesson2" ausgegeben. Das möchte ich nicht.
Dann beschreib halt mal, welche Anordnung dir vorschwebt.
naheliegend hat geschrieben: Donnerstag 30. August 2018, 17:06 gibt es einen Befehl writecolumn?
Nein, gibt es nicht. Aber es gibt zip() und andere Möglichkeiten, siehe mein vorheriger Beitrag.
naheliegend hat geschrieben: Donnerstag 30. August 2018, 17:06 Kann man JSON auch in eine Textdatei schreiben?
Kann man, da es ja einfach ein String ist. Und JSON in Textdateien ist auch üblich, sofern es nicht über's Netz übertragen wird. Irgendwie müssen die vorliegenden Dateien ja auch befüllt worden sein. :)
Zuletzt geändert von snafu am Donnerstag 30. August 2018, 17:18, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natuerlich. Das ist ja eine Teilmenge von Javascript, und das wird ueblicherweise von Programmierern in Dateien geschrieben ;)

Und was die Ergonomie angeht: Dateien komplett wieder neu zu schreiben ist nicht ungewoehnlich, und so lange du da keine messbaren Probleme bekommst, solltest du dich darum nicht sorgen. Sondern eher um Klarheit und Einfachheit des Codes und der Daten bemueht sein.
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: Es gibt kein `writecolumn()`, aber wozu braucht man das? Unergonomisch ist ja schon das zusammengehörige Daten in ”parallelen” Listen gespeichert sind. Stell Dir mal vor Du hast da 100 Vokabeln drin und willst irgendwo eine einfügen, ändern, oder löschen — dann muss man ja immer gut aufpassen, dass man in den beiden ”unabhängigen” Listen auch exakt die Elemente anfasst die zusammen gehören. Das ist wesentlich einfacher wenn die nicht in zwei Listen stehen, sondern als Paare in einer Liste. Was dann auch einfach mit `writerows()` in eine CSV-Datei zu schreiben wäre.

Was das mit der Lektion angeht: Was soll diese Liste denn überhaupt bedeuten? Wenn die Daten in den beiden anderen Listen alle zu Lektion 1 gehören, welche gehören dann zu Lektion 2 und wie wird das zugeordnet? Zumal das ja schon wieder eine ”unabhängige” Datenstruktur ist, bei der die Daten eigentlich zu anderen Daten dazu gehören.

Und wie schon gesagt wurde, ist dieses Datum in der CSV-Datei nicht wirklich gut aufgehoben, denn das ist ja eine 2D-Struktur. Es sei denn Du willst da noch mehr Struktur(en) ”informell” drin unterbringen. Was ich persönlich eher nicht machen würde. Bei etwas komplizierterem als 2D ist man dann doch besser mit JSON oder einer relationalen Datenbank aufgehoben. IMHO.

Zu JSON siehe auch https://json.org/
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Danke Leute. Ich nehme dann den JSON.

Wie lagere ich denn Listen am besten im JSON ein?

Code: Alles auswählen

All = {json.dumps(Name): [ { "Deu": json.dumps(Deutsch), "Eng": json.dumps(Englisch) } ] }
Sowas wäre ja quatsch, weil ich dann nicht mehr auf die einzelnen Teile von Deutsch und Englisch zugreifen kann. Oder gibt es eine Möglichkeit die beim Einlesen wieder anhand des Komma zu separieren?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: Nimm die ganzen `json.dumps()`-Aufrufe aus der Struktur heraus und wende den Aufruf *einmal* auf die *gesamte* Struktur an.

Wobei die Struktur komisch ist, denn warum ist da eine Liste mit *einem* Element, das macht keinen Sinn. Und wieder bzw. immer noch, warum sind die ganzen Deutschen und Englischen Worte in getrennten Listen? Die Daten gehören jeweils Paarweise zusammen, also macht es *immer noch* mehr Sinn die auch *so* zu speichern. Irgendwo muss man sonst am Ende Code haben der die zusammen führt, den man sich sparen kann.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten