Wert in genau eine .csv-Zelle schreiben

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
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Hi,

gibt es eine einfache Funktion, mit der man z.B. eine Zahl ganz gezielt in eine bestimmte Zelle einer .csv schreiben kann? Auslesen klappt, andersrum stehe ich auf dem Schlauch.

Danke für eure Vorschläge!
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, du musst komplett einlesen, den Wert an der entsprechenden Stelle aendern, und die gesamte Datei wieder rausschreiben. Das ist konzeptionell auch nicht anders moeglich, weil das OS eine Datei als einen Strom von Bytes betrachtet, und keine Unterstruktur kennt.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Schade, ich habe gehofft es gäbe etwas schlankeres. :)
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

So richtig komme ich nicht weiter..

Ich habe die .csv wie folgt eingelesen:

Code: Alles auswählen

import csv

dateihandler = open('test.csv')

inhalt = dateihandler.read()

werte = []

zeilen = inhalt.split('\n')

for i in range(len(zeilen)):
    spalten = zeilen[i].split(';')
    werte.append(spalten)

density = int(werte[3][3])
Jetzt komme ich mit den bekannten Tutorials aber nicht weiter. Ich habe mir vorgestellt mit "werte[1][1]=int(96)" die entsprechende Zelle zu ändern... Aber ich finde nicht heraus wie ich die csv dann wieder richtig abspeichern kann...
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Hans-Uwe: Hast du denn schon mal in der Dokumentation der Python-Standard-Bibliothek nach csv gesucht?
In specifications, Murphy's Law supersedes Ohm's.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Ja, nur ist mir das zu kurz um es zu verstehen.

Ich bekomme imme die Fehlermeldung, dass in dem Objekt "csv" kein Modul "writer" vorhanden ist... Die Python-Version hier ist 2.7.3.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Lass mich raten - dein Skript heisst "csv.py"?
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

@__deets__: 100 Punkte. Klang für mich nach einem schnellen, einfachen Namen um das Skript zu testen. :D
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Ich habe es jetzt schonmal mithilfe eines einfachen Beispiels geschafft einen Wert in die bestehende csv zu schreiben. Nur wird mir bei meiner Lösung komplett die Formatierung verhunzt.

Code: Alles auswählen

dateihandler = open('Phosphor_Kennwerte.csv')

inhalt = dateihandler.read()

werte = []

zeilen = inhalt.split('\n')

for i in range(len(zeilen)):
    spalten = zeilen[i].split(';')
    werte.append(spalten)

werte[10][10] = 'hallo'

csv.writer(open('Phosphor_Kennwerte.csv', 'w')).writerows(werte)
Für jede nicht beschriebene Spalte pro Zeile wird ein Komma eingefügt, ohne die Spalten aufzutrennen. Ich habe doch die bestehende csv eingelesen und übernehme daraus ja auch die Formatierung, oder nicht? Wieso wird das so komplett über den Haufen geworfen?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du solltest sowohl zum als auch auslesen das csv Modul verwenden, und fuer dessen reader und writer gibt es einen delimiter Parameter. Den musst du setzen, es gibt keine Magie, die irgendwie erraet, dass du mal was mit Semikola an einer anderen Stelle gemacht hast.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Jo, ich habs gerade nochmal anders probiert und hinbekommen. Für die Nachwelt:

Code: Alles auswählen

import csv


dateihandler = open('Phosphor_Kennwerte.csv')

inhalt = dateihandler.read()

werte = []

zeilen = inhalt.split('\n')

for i in range(len(zeilen)):
    spalten = zeilen[i].split(';')
    werte.append(spalten)

werte[0][1] = 'hallo'

with open('Phosphor_Kennwerte.csv', 'wb') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerows(werte)
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und Zeilen 4 - 14 kannst du durch

Code: Alles auswählen

with open(('Phosphor_Kennwerte.csv') as inf:
     werte = list(csv.reader(inf, delimiter=";"))
ersetzen.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Ok, in meinem großen, entgültigen Skript habe ich das intuitiv getan. Nur in dem kleinen Test nicht. :)

Danke für die Hilfe!

Edit: Kurz zur Erklärung: In meinem eigentlichen Skript lese ich Stoffdaten aus, simuliere dann etwas skriptbasiert und lasse das Ergebnis in die gleiche Excel schreiben, aus der ich auch die Stoffdaten habe.

Edit2: Ups, das ist ja doch etwas anderes. Hab nicht genau hingeguckt. Ich brauche Zeile 4-14 aber aus oben genanntem Grund trotzdem.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hans-Uwe hat geschrieben:Edit2: Ups, das ist ja doch etwas anderes. Hab nicht genau hingeguckt. Ich brauche Zeile 4-14 aber aus oben genanntem Grund trotzdem.
Aus welchem Grund? Die kurz gefasste Version sollte das gleiche Ergebnis liefern.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Naja, weil ich erst spezielle Parameter aus bestimmten Zellen der csv auslesen möchte.

Code: Alles auswählen

# read Phosphor Data
dateihandler = open('Phosphor_Kennwerte.csv')

inhalt = dateihandler.read()

werte = []

zeilen = inhalt.split('\n')

for i in range(len(zeilen)):
    spalten = zeilen[i].split(';')
    werte.append(spalten)


density = int(werte[3][3])
particleindex = float(werte[4][3])
size = int(werte[5][3])
minthresh = float(werte[6][3])
bluemin = float(werte[7][3])
bluemax = float(werte[8][3])
fluorescenttrans = int(werte[9][3])
scattertrans = int(werte[10][3])
power = int(werte[11][3])
Anschließend werden die Parameter an eine Simulationssoftware übergeben, es wird simuliert und ich lasse mir einen Ergebniswert zurückgeben. Dieser wird dann mit

Code: Alles auswählen

#write Data
werte[14][3] = flux

with open('Phosphor_Kennwerte.csv', 'wb') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerows(werte)
wieder in die entsprechende csv geschrieben.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja und? Mein Code bezieht sich lediglich auf das einlesen der Daten. Warum vertraust du *da* dem CSV-Modul nicht, aber spaeter beim schreiben :K
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Dann habe ich dich misverstanden und es dann auch (noch) nicht ausprobiert. Ich dachte du gehst davon aus, dass ich ausschließlich etwas gezielt in eine Zelle schreiben möchte. Dass dein Code für das einlesen zuständig ist habe ich nicht gecheckt..
Antworten