CSV Liste erstellen und Ordnen

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
Mueller.D
User
Beiträge: 33
Registriert: Freitag 13. Januar 2017, 10:04

Guten morgen, ich bin es mal wieder.
Ich brauch einen Ansatz, ich weiß noch nicht wirklich weiter.

Aufgabe:
In einem Hörsaal befinden sich Studenten die Ihre eigene Matrikelnummer und Fachrichtung haben.
1. Generiere mit Python eine CSV Datei, die in einer Spalte die Matrikelnummer anzeigt und in einer weiteren die Fachrichtung.
2. Für jeden Student soll eine Zeile erstellt werden, wenn er das erste mal zur Vorlesung kommt. Falls er schon in der Liste
steht, dann soll sie so bleiben. Falls nicht, dann soll er zu der Liste hinzugefügt werden.

Ich mach es erst mit drei Studenten, in der Aufgabe ist die Anzahl unbekannt und soll einfach alle ausgeben die da waren.

Matrikelnummer: Fachrichtung:
20202020 Mathe
30303030 Sport
40404040 Design

Zudem weiß ich nicht, wie man "Fachrichtung" in eine zweite Splate schreiben soll.

Ich wäre dankbar um einen Lösungsansatz
BlackJack

@Mueller.D: Für CSV-Dateien gibt es das `csv`-Modul in der Standardbibliothek. Es gibt für das Format keine formale Definition, aber ein RFC das eine verbreitete Definition enthält: Common Format and MIME Type for Comma-Separated Values (CSV) Files.
Mueller.D
User
Beiträge: 33
Registriert: Freitag 13. Januar 2017, 10:04

Gibt es eine Möglichkeit, dass ich die Spalten zuweisen kann. Sodass es getrennt und "ordentlich" ausschaut? Warum springt er von Zeile 1 auf Zeile 3?

Code: Alles auswählen

mydict = {'20202020': 'Mathe', '30303030': 'Sport', '40404040': 'Design'}


with open('names.csv', 'w',) as csv_file:
    writer = csv.writer(csv_file)
    for key, value in mydict.items():
       writer.writerow([key, value])
Zuletzt geändert von Anonymous am Donnerstag 9. Februar 2017, 13:41, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
Cronut
User
Beiträge: 34
Registriert: Sonntag 5. Februar 2017, 09:50
Wohnort: HRO, GER

Also eine ordentliche Spaltentrennung würde ich dir nicht empfehlen. Die CSV-Datei ist nicht unbedingt dazu gedacht von Menschen gelesen zu werden (auch wenn man sich gerne durch große CSV-Dateien wurschteln kann).

Um eine odentliche Anpassung der Spaltenbreite vornehmen zu können, müsstest du die Länge deiner bisherigen und deiner zukünftigen Daten kennen, dann könntest du schon die Breite mit z.B. Leerzeichen auffüllen und diese später wieder entfernen.

Viel sinnvoller allerdings ist es, wenn du die Daten, wenn du sie vom Programm ausgeben lässt entsprechend optisch schön formatierst.

Was den doppelten Zeilenumbruch angeht. Ich weiß es jetzt nicht genau, aber ich würde annehmen, dass
bei einem Append "automatisch" schon ein Umbruch vorgenommen wird und dann nochmals von writer.writerow(...).

Hier ein Fix:

Code: Alles auswählen

import csv

mydict = {'20202020': 'Mathe', '30303030': 'Sport', '40404040': 'Design'}

# ich hab hier 'a' genommen, du kannst natürlich auch 'w' verwenden und neue
# Daten an den Anfang anhängen
with open('names.csv', 'a', newline='') as csv_file:
	writer = csv.writer(csv_file)

	for key, value in mydict.items():
		writer.writerow([key, value])
“Clean code always looks like it was written by someone who cares.” (Michael Feathers)
Check out: https://awesome-python.com/
BlackJack

@Mueller.D @Cronut: Unter Python 2 muss man die Datei unbedingt im Binärmodus öffnen damit Windows keinen Murks mit den Dateienden macht. Das was Cronut da mit `newline` schreibt, macht keinen Sinn. Sind denn da überhaupt zu viele Zeilenenden in der Datei oder ist Mueller.D vielleicht eher darüber gestolpert das Wörterbücher ungeordnet sind?

Man könnte die `mydict.items()` auch der `writerows()`-Methode übergeben und sich so die Schleife im eigenen Code sparen.
Mueller.D
User
Beiträge: 33
Registriert: Freitag 13. Januar 2017, 10:04

@Cronut: Danke für den Wink, ich weiß nicht weshalb, aber die Umbrüche sind dank dir weg :D. Danke
BlackJack

@Mueller.D: Das ist nicht normal, da muss irgendein anderer Fehler vorliegen, denn das was Cronut schreibt ist *keine* Lösung sondern Voodoo!
Benutzeravatar
Cronut
User
Beiträge: 34
Registriert: Sonntag 5. Februar 2017, 09:50
Wohnort: HRO, GER

@BlackJack: Ich dachte, dass ist das was Programmierer machen. MAGIE! :lol:

Die obige CSV-Datei sah in er Original-Ausgabe so aus:

Code: Alles auswählen

20202020,Mathe

30303030,Sport

40404040,Design

Hier steht, man soll das so machen: https://docs.python.org/3/library/csv.html#id3 [Fußnote]

Oder wie du sagtest mit dem Binary Mode (Hab ich noch nie benutzt, seit ich Python nutze! :oops: )
“Clean code always looks like it was written by someone who cares.” (Michael Feathers)
Check out: https://awesome-python.com/
BlackJack

@Cronut: Okay, das ist dann also eine Python 3-Sache. Ich sollte aufhören zu Python 3 Antworten zu schreiben. :-)
Benutzeravatar
Cronut
User
Beiträge: 34
Registriert: Sonntag 5. Februar 2017, 09:50
Wohnort: HRO, GER

@BlackJack: Kenne mich da noch nicht so aus, bzw. Versuche erstmal die Python 3 Konstrukte usw. zu lernen und wenn ich mit Python 2 in Berührung komme, ist das auch völlig ok (wer weiß, wann man mal was für Code vorgelegt bekommt). Du darfst also gerne darauf Antworten, hilft doch wenn man zumindest mal davon gehört hat. Ich kann hier bis jetzt auch noch nicht immer erkennen, wann Python 2/3 benutzt wird.
“Clean code always looks like it was written by someone who cares.” (Michael Feathers)
Check out: https://awesome-python.com/
Antworten