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!
Wert in genau eine .csv-Zelle schreiben
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.
So richtig komme ich nicht weiter..
Ich habe die .csv wie folgt eingelesen:
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...
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])
- 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.
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.
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?
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)
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.
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)
Und Zeilen 4 - 14 kannst du durch
ersetzen.
Code: Alles auswählen
with open(('Phosphor_Kennwerte.csv') as inf:
werte = list(csv.reader(inf, delimiter=";"))
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.
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.
Aus welchem Grund? Die kurz gefasste Version sollte das gleiche Ergebnis liefern.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.
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.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Naja, weil ich erst spezielle Parameter aus bestimmten Zellen der csv auslesen möchte.
Anschließend werden die Parameter an eine Simulationssoftware übergeben, es wird simuliert und ich lasse mir einen Ergebniswert zurückgeben. Dieser wird dann mit
wieder in die entsprechende csv geschrieben.
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])
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)
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..