.csv Trennzeichendilemma
@Hans-Uwe: In Deinem Beispielcode verwendest Du nicht das csv-Modul zum Lesen der Daten, sondern interpretierst das csv-Format selbst. Und dabei berücksichtigst Du nicht die Quotation-Marks ("), welche die Separatoren innerhalb einer Zelle schützen.
@Hans-Uwe: Du liest ja die Werte auch nicht mit dem csv-Modul ein, sondern machst irgendwas von Hand, was dann auch nicht so funktioniert, wie Du denkst. Das hat __blackjack__ ja schon erklärt, dass man irgendwie kennzeichnen muß, dass das ; kein Trennzeichen ist, sondern ein Wert.
Zeilen wie »import os as os« ist das as ja quatsch, und bei den anderen Imports ist fraglich, warum da Module kryptisch abgekürzt werden.
Zeilen wie »import os as os« ist das as ja quatsch, und bei den anderen Imports ist fraglich, warum da Module kryptisch abgekürzt werden.
Diese Ein- und Auslesezeilen habe ich aus einem Youtube Tutorial.
Wie kann man die Quotationmarks denn in meinem Fall berücksichtigen? Ich lese ja aus einer Zelle und Python macht dann daraus einen String. Ich wüsste jetzt nicht wie ich darauf Einfluss nehmen soll...
Ist Vorgabe von dieser bescheuerten Software-Erweiterung PyZDDE.
Kann mir jemand helfen?
Ich habe es jetzt hinbekommen, dass die Auslesezelle 1,2,1; so bestehen bleibt. Jetzt werden aber die Zellen daneben mit jedem Scriptdurchlauf mit immer mehr werdenden Anführungsstrichen gefüllt. Außerdem werden noch Zellen in einem ganz anderen Teil der Tabelle mit Anführungsstrichen gefüllt. Siehe Screenshots:
https://ibb.co/ga53CJ
https://ibb.co/guyyCJ
Ich kann nicht erkennen, wo mein Code so falsch ist, dass so ein ungewollter Quatsch passiert.
Ich habe es jetzt hinbekommen, dass die Auslesezelle 1,2,1; so bestehen bleibt. Jetzt werden aber die Zellen daneben mit jedem Scriptdurchlauf mit immer mehr werdenden Anführungsstrichen gefüllt. Außerdem werden noch Zellen in einem ganz anderen Teil der Tabelle mit Anführungsstrichen gefüllt. Siehe Screenshots:
https://ibb.co/ga53CJ
https://ibb.co/guyyCJ
Ich kann nicht erkennen, wo mein Code so falsch ist, dass so ein ungewollter Quatsch passiert.
Code: Alles auswählen
###Write Data
werte[16][3] = power
with open('H:\\Simulation\\Phosphor_Kennwerte1.csv', 'wb') as f:
writer = csv.writer(f, delimiter=';')
writer.writerows(werte)
Das reicht nicht, um das Problem nachvollziehen zu koennen. Aber es klingt so, als ob du die Daten falsch einliest, ohne das dort die Anfuehrungszeichen beachtet werden. Um sie dann *mit* Anfuehrungszeichen zu speichern. Dadurch pumpen die sich auf.
Wie liest du denn die Datei ein?
Wie liest du denn die Datei ein?
Ja, das wurde mir gestern auch schon gesagt, aber ich weiß nicht wie man das macht. So lese ich aus:
Ich dachte, dass ich mit dem str() schon angebe, dass der Inhalt der Zelle ein String ist und auch bleiben soll.
Code: Alles auswählen
### read Data
dateihandler = open('H:\\Simulation\\Phosphor_Kennwerte1.csv')
inhalt = dateihandler.read()
werte = []
zeilen = inhalt.split('\n')
for i in range(len(zeilen)):
spalten = zeilen[i].split(';')
werte.append(spalten)
##Phosphor Properties
particleindex = float(werte[3][3])
wavelengthshift = str(werte[11][3])
- __blackjack__
- User
- Beiträge: 13080
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Dann lies das nicht so aus. Für CSV gibt es das `csv`-Modul.
Und der einzige `str()`-Aufruf im gezeigten Quelltext hat rein gar nichts mit dem Problem zu tun. An der Stelle hast Du schon falsche Werte in `werte`, weil das einfache Aufteilen an ';' nicht funktioniert, denn an ';' innerhalb von doppelten Anführungszeichen darf nicht aufgeteilt werden.
Und der einzige `str()`-Aufruf im gezeigten Quelltext hat rein gar nichts mit dem Problem zu tun. An der Stelle hast Du schon falsche Werte in `werte`, weil das einfache Aufteilen an ';' nicht funktioniert, denn an ';' innerhalb von doppelten Anführungszeichen darf nicht aufgeteilt werden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Noe. Du liest CSVs selbstgefrickelt ein, und beim schreiben benutzt du einen CSV-writer, der eine ganze Reihe von "magischen" Dingen fuer dich tut, wie zB einen waehlbaren Delimiter zu benutzen, und eben auch Leerstrings in Anfuehrungszeichen verpackt, oder zB wenn der delimiter im String vorkommt - um das zu unterscheiden von einem gewollten Delimiter.
Da du auf diese Annehmlichkeiten beim einlesen verzichtest, und einfach gar nix machst, werden diese Regeln beim einlesen nicht angewandt, und du endest mit '""' (beachte die einfachen Anfuehrungszeichen UM die doppelten - ein String, der zwei Anfuehrungszeichen enthaelt!).
Dadurch das "pumpen". Benutz den analog zum csvwriter konfigurierten csvreader, und alles sollte funktionieren.
Da du auf diese Annehmlichkeiten beim einlesen verzichtest, und einfach gar nix machst, werden diese Regeln beim einlesen nicht angewandt, und du endest mit '""' (beachte die einfachen Anfuehrungszeichen UM die doppelten - ein String, der zwei Anfuehrungszeichen enthaelt!).
Dadurch das "pumpen". Benutz den analog zum csvwriter konfigurierten csvreader, und alles sollte funktionieren.
Habe dieses Beispiel gefunden:
Damit bekomme ich einen IndexError. "List index out of range"
Code: Alles auswählen
import csv
with open('H:\\Simulation\\Phosphor_Kennwerte2.csv', 'rb') as x:
reader = csv.reader(x, delimiter=';')
data = list(csv.reader(x))
print(data[3][3])
Seufz. Das hilft hier doch keinem, so eine Angabe. Offensichtlich ist data nicht das, was du erwartest. Also zeig uns doch (und dir) wie es WIRKLICH aussieht. Dann klaert sich auch, warum der csvreader da etwas anderes interpretiert, als du es erwartest.
Falls das nicht klar gewesen sein sollte: pack einfach ein print(data) vor deinen Versuch, auf ein bestimmtes Element zuzugreifen. Dann sollte man das schon erkennen koennen. Wenn man es schoener machen will, nimmt man
Code: Alles auswählen
import pprint
pprint.pprint(data)
Mit dieser Methode klappt alles, nur ausschließlich der String wird nicht an die Simulationssoftware übergeben - ausgelesen wird er:
Code: Alles auswählen
import csv
werte = []
reader = csv.reader(open("H:\\Simulation\\Phosphor_Kennwerte2.csv"), delimiter=';')
for row in reader:
werte.append(row)
##Phosphor Properties
particleindex = float(werte[3][3])
size = float(werte[4][3])
density = float(werte[5][3])
minthresh = float(werte[6][3])
bluemin = float(werte[7][3])
bluemax = float(werte[8][3])
fluorescenttrans = float(werte[9][3])
scattertrans = float(werte[10][3])
wavelengthshift = str(werte[11][3])
meanfreepath = float(werte[12][3])
pprint:__deets__ hat geschrieben: ↑Freitag 29. Juni 2018, 14:15 Falls das nicht klar gewesen sein sollte: pack einfach ein print(data) vor deinen Versuch, auf ein bestimmtes Element zuzugreifen. Dann sollte man das schon erkennen koennen. Wenn man es schoener machen will, nimmt man
Code: Alles auswählen
import pprint pprint.pprint(data)
Code: Alles auswählen
[['Werkstoff Kennwerte Phosphor;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;NSCE;;;;;;;;;;;;;;;;;;;;;;;;;;'],
['Zemax Optic Studio:;;;Wert;Kommentar;;;;Ref. Object;Inside of;X Position;Y Position;Z Position',
';Tilt About X;Tilt About Y;Tilt About Z;Material;Front R;Z Length;Back R;;;;;;;;;;;;;;'],
['Volume Physics',
' Cylinder Volume;;Particle Index;1.8;Einheitenlos;;;Cylinder V.;0;0;0;0;0;0;0;0;;1;1.733;3;;;;;;;;;;;;;;'],
[';;Size;1;Partikelradius [µm];;;;;;;;;;;;;X1 Half Width;Y1 Half Width;Z Length;X2 Half Length;Y2 Half Length;Front X Angle;Front Y Angle;Rear X Angle;Rear Y Angle;;;;;;;;'],
[';;Density;4.56;Dichte [g/cm\xb3];;;Rectangle V.;0;1;0;0;0;0;0;0;;0.7;0.7;0.25;0.7;0.7;0;0;0;0;;;;;;;;'],
[';;Min. thresh.;0.001;;;;;;;;;;;;;;# Layout Rays;# Analysis Rays;Power (Watts);Wavenumber;Color #;X Half Width;Y Half Width;Source Distance;Cosine Exponent;Gauss Gx;Gauss Gy;Source X;Source Y;;;;'],
[';;Blue min.;0.46;Mindestwellenlänge [µm];;;Source Rect.;0;2;0;0;0;0;0;0;;50;100000;1;1;0;0.7;0.7;0.1;0;1;1;0;0;;;;'],
[';;Blue max.;0.48;Maximale Wellenlänge [µm];;;;;;;;;;;;;X Half Width;Y Half Width;# X Pixels;# Y Pixels;Data Type;Color;Smoothing;Scale;Plot Scale;Front Only;PSF Wave;X Angle Min;X Angle Max;Y Angle Min;Y Angle Max',
';Polarisation;Mirroring'],
[';;Fluorescent trans.;1;;;;Detector Rec.;0;0;0;0;1.743;0;0;0;ABSORB;3;3;200;1;0;0;0;0;0;0;0;-90;90;-90;90;0;0'],
[';;Scattering trans.;1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Wavelength Shift;"1', '2', '1;";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Mean Free Path;2;Mittlere freie Weglänge [mm];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Waveleng 1;0.47;Wellenlänge 1 [nm];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Waveleng 2;0.57;Wellenlänge 2 [nm];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';Ergebnis:;Total Power;0.8044195770381157;Watt [W];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
['Abaqus CAE:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';YAG:Ce Phosphor;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Density;4560;Dichte [kg/m\xb3];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Thermal conductivity;11;Wärmeleitfähigkeit [W/(m K)];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Specific Heat;590;spez. Wärmekapazität [J/(kg K)];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';Aluminium;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Density;2700;Dichte [kg/m\xb3];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Thermal conductivity;230;Wärmeleitfähigkeit [W/(m K)];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Specific Heat;910;spez. Wärmekapazität [J/(kg K)];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';GaN;;;;;;;BC_Source;393.15;Temperatur [K];;;;;;;;;;;;;;;;;;;;;;;'],
[';;Density;6100;Dichte [kg/m\xb3];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Thermal conductivity;130;Wärmeleitfähigkeit [W/(m K)];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;Specific Heat;490;spez. Wärmekapazität [J/(kg K)];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';Ergebnisse:;TEMP_min;288.186;Temperatur [K];;;;;;;;;;;;;;;;;;;;;;;;;;;;;'],
[';;TEMP_max;394.102;Temperatur [K];;;;;;;;;;;;;;;;;;;;;;;;;;;;;']]