Schreiben einer CSV, warum gleicher Inhalt mehrmals in Datei

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
alltogo
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2015, 19:50

Hallo,

wie ihr unschwer erkennen könnt bin ich ein absoluter Anfänger welcher dazu noch ratlos ist...

Ich möchte eine CSV mit datenset´s füttern, das klappt auch schon allerdings wenn ich die CSV öffne habe ich die eingegebenen Daten zig mal untereinander stehen....

Hier der Code:

Code: Alles auswählen

__author__ = 'Mike'

import csv

def add_column():

    print("Add a new column, follow the introduction....")

    name_column = str(input("Enter the name of the new column: "))
    type_column = str(input("Enter the type ot the new column (e.g. RP,NP,SAX,WAX,CIRAL: "))
    lenght_column = input("Enter the lenght of the new column [mm]: ")
    dia_column = input("Enter the diameter of the new column: ")
    porsize_column = input("Enter the poresize of the new column: ")
    particlesize_column = input("Enter the particlesize of the new column [µm]: ")


    dataset_column= '%s,%s,%s,%s,%s,%s' %(name_column,type_column,lenght_column,dia_column,porsize_column,particlesize_column)


    fobj = open("column.csv", "w")
    for engl in dataset_column:
        fobj.write( dataset_column + "\n")
    fobj.close()


add_column()
und hier das was in die CSV geschreiben wird.
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
test,rp,100,5,100,3
So, jetzt frag ich mich natürlich warum dort so viele gleiche Datensätze auftauchen und nicht nur eine.

gruß
Mike
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Hab zwar noch nie i.was mit CSVs programmiert, aber es könnte daran liegen, dass fobj.write() in ner Schleife steht. Für CSVs gibts übrigens ein Modul in der Stdlib.
PS: Die angebotene Summe ist beachtlich.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@alltogo: warum importierst Du csv, wenn Du es nicht benutzt?
Was machst Du mit der for-Schleife? Was steht in engl und was in dataset_column?
alltogo
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2015, 19:50

Ah klar danke für den Hint Üpsilon :)
so funktionierts,

Code: Alles auswählen

 
 fobj = open("Column.csv", "w")
 fobj.write( dataset_column + "\n")
 fobj.close()
was mir immer noch nicht klar ist warum er diese Anzahl an Einträgen macht, logischer wäre doch das er gar nicht mehr aufhört Einträge zu schreiben...

Danke nochmal :D

EDIT:
Hab das mit der for schleife jetzt rausgeschmissen und import csv auch, da wie du sagtest nicht benötigt wird. Hatte das aus einem Beispiel.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@alltogo: Genau, jetzt hast du es. Wundere dich aber nicht, wenn dein Zahnarzt demnächst zu dir sagt: "Ich weiß nicht genau welcher Zahn kaputt ist, deshalb schlage ich vor, einen nach dem anderen zu ziehen, und dann zu schauen, ob es nicht mehr weh tut."

Anders ausgedrückt: Programmieren geht nicht so, dass man blindlings irgendwas hinschreibt und wieder aus dem Programm rausnimmt bis es irgendwann zu funktionieren scheint. Würdest du dich in ein Flugzeug setzen wollen, dessen Software so geschrieben wurde? Oder auch nur in ein Auto?

Richtig programmieren geht so: Man versucht das zu lösende Problem zu verstehen und gibt ihm eine formale Darstellung in einer Programmiersprache. Zum Verstehen eines Problems gehört das Zerlegen in Teilprobleme, wie zB. das Verarbeiten und Erzeugen einer CSV-Datei. Da das ein immer wiederkehrendes (Teil-)Problem ist, steht zu vermuten, dass du nicht der erste Mensch auf der Welt bist, der das lösen muss. Vermutlich gibt es also schon eine Lösung dafür. Und du hattest sie ja schon gefunden und sogar importiert, nämlich das csv-Modul aus der Standardbibliothek. Warum verwendest du es denn nicht?

Außerdem erzeugt add_column() bei dir keine Column (d.h. Spalte), sondern eine Row (d.h. Zeile). Die Funktion sollte also add_row() heißen.

In deiner CSV-Datei wirst du übrigens immer nur die zuletzt gespeicherte Zeile finden. Schau dir mal deinen Code an und versuche herauszufinden, warum das so ist. Kleiner Tipp: folge diesem Link und lies nach, was open(..., 'x') macht.

Hier eine halbwegs brauchbare - aber immer noch suboptimale - Version mit einer kleinen Erweiterung am Ende:

Code: Alles auswählen

import csv

CSV_FILE_NAME = 'rows.csv'
FIELD_NAMES = [
    'name',
    'type',
    'lenght',
    'dia',
    'porsize',
    'particlesize',
]

def init():
    with open(CSV_FILE_NAME, 'w') as csv_file:
        writer = csv.DictWriter(csv_file, fieldnames=FIELD_NAMES)
        writer.writeheader()

def add_row(filename):
    print('Add a new row, follow the introduction....')
    record = dict(
        name=input('Enter the name of the new row: '),
        type=input('Enter the type ot the new row (e.g. RP,NP,SAX,WAX,CIRAL: '),
        lenght=input('Enter the lenght of the new row [mm]: '),
        dia=input('Enter the diameter of the new row: '),
        porsize=input('Enter the poresize of the new row: '),
        particlesize=input('Enter the particlesize of the new row [µm]: '),
    )
    with open(CSV_FILE_NAME, 'wa') as csv_file:
        writer = csv.DictWriter(csv_file, fieldnames=FIELD_NAMES)
        writer.write(record)

init()
for _ in range(int(input('Enter the number of rows you want to add: '))):
    add_row()
Ungetestet.
In specifications, Murphy's Law supersedes Ohm's.
alltogo
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2015, 19:50

Hallo pillmuncher

erst einmal Entschuldigung das die Antwort so lange dauerte. Du hast dir mit der Beantwortung meiner Frage sehr viel mühe gegeben, Danke hierfür.

Mir ist durchaus bewusst das man zuerst das Problem analysiert und dann die Teil-Lösungen ausarbeitet. Allerdings möchte ich Python ja lernen und dies fällt mir am einfachsten wenn ich das an "echten Projekten" erlernen wobei mir die Try/Error Taktik hilft, denn jedes Problem muss hinterfragt werden und endet darin das ich mir wissen anlese.
Außerdem erzeugt add_column() bei dir keine Column (d.h. Spalte), sondern eine Row (d.h. Zeile). Die Funktion sollte also add_row() heißen.

Da hast du ja recht, aber mit add_column() meine ich nicht eine Spalte hinzuzufügen es geht hier um HPLC Säulen ( Chromatographie ) deren Säulen Parameter ( 200mm lang, 4mm Durchmesser, etc. ) in die Datei geschrieben werden sollen um nachher mit diesen Werten Berechnungen durchzuführen.


Nichts desto trotz hast du mir klar gemacht das ich mich etwas mehr mit den "Kleinigkeiten" befassen sollte, hierfür habe ich mich jetzt bei der Codeacademy angemeldet um das ganze von Anfang an zu erlernen, danke außerdem für den Link, zusätzliche Literatur habe ich mir auch schon besorgt.

Ich werde jetzt erst einmal Basics vertiefen und nicht Stupide aus Beispielen Copy Pasten :)

gruß
alltogo
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

alltogo hat geschrieben:
Außerdem erzeugt add_column() bei dir keine Column (d.h. Spalte), sondern eine Row (d.h. Zeile). Die Funktion sollte also add_row() heißen.
Da hast du ja recht, aber mit add_column() meine ich nicht eine Spalte hinzuzufügen es geht hier um HPLC Säulen
Dann würde ich das add_hplc_column() nennen.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@alltogo: Ich denke es geht hier im speziellen auch darum warum die rausgeworfene Schleife falsch war. Und Du solltest auch herausfinden wie viele Zeilen die geschrieben hat. Also wovon die Anzahl der geschriebenen Zeilen abhängt.
alltogo
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2015, 19:50

@pillmuncher: Okay, Variablen eindeutiger benennen, merke ich mir
@BlackJack:
Ich habe das Programm paar mal durchlaufen lassen und immer eine neue Datei angelegt, das ich vergleichen kann, die Anzahl an Einträgen ändert sich mit der Anzahl an Zeichen :K Aber mir ist nicht klar warum er mal 11 Zeilen mach und mal 19 Zeilen usw.
thorius
User
Beiträge: 7
Registriert: Mittwoch 4. März 2015, 08:04

alltogo hat geschrieben:
was mir immer noch nicht klar ist warum er diese Anzahl an Einträgen macht, logischer wäre doch das er gar nicht mehr aufhört Einträge zu schreiben...
vergleiche doch mal die Anzahl der Einträge mit der Länge von dataset_column. Dann kommst du sicher drauf.

--
Thomas
alltogo
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2015, 19:50

thorius hat geschrieben:
alltogo hat geschrieben:
was mir immer noch nicht klar ist warum er diese Anzahl an Einträgen macht, logischer wäre doch das er gar nicht mehr aufhört Einträge zu schreiben...
vergleiche doch mal die Anzahl der Einträge mit der Länge von dataset_column. Dann kommst du sicher drauf.

--
Thomas
Jetzt fällt es mir wie schuppen von den Augen ( glaube ich), ich hatte so was vermutet aber bei meiner Zählerei waren immer 5 zu wenig. Das Komma wird mitgezählt !? Also mach er so viele Wiederholungen wie es ZEICHEN sind nicht Werte.
BlackJack

@alltogo: Die Werte in diesem Fall sind ja Zeichen.
Antworten