Seite 1 von 1

csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 12:11
von naheliegend
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

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 12:30
von snafu
Na, dann mach aus dem All[0][0] mal besser ein All[0]...

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 12:33
von noisefloor
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

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 13:54
von __blackjack__
Die Anordnung der Daten ist auch ein bisschen ungewöhnlich. Üblicher wäre eine Spalte für jede Sprache und keine Zeile.

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 14:21
von snafu
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())

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 17:06
von naheliegend
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?

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 17:13
von snafu
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. :)

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 17:14
von __deets__
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.

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 17:30
von __blackjack__
@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/

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 17:53
von naheliegend
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?

Re: csv.writer sperariert jedes char eines strings?

Verfasst: Donnerstag 30. August 2018, 22:28
von __blackjack__
@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.