Seite 2 von 3

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 19:23
von Hans-Uwe
Sirius3 hat geschrieben: Donnerstag 28. Juni 2018, 18:44 Wie sind denn Deine csv-Import und -Exporteinstellungen in Excel?
Keine Ahnung. In den erweiterten Excel-Optionen finde ich dazu nichts. Google hilft mir auch nicht weiter. Hast du einen Tipp wo ich gucken muss?

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 12:19
von Hans-Uwe
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.

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)

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 12:30
von __deets__
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?

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 12:42
von Hans-Uwe
Ja, das wurde mir gestern auch schon gesagt, aber ich weiß nicht wie man das macht. So lese ich aus:

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])
Ich dachte, dass ich mit dem str() schon angebe, dass der Inhalt der Zelle ein String ist und auch bleiben soll.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 12:54
von __blackjack__
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.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 12:55
von __deets__
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.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 13:07
von Sirius3
Zum Einlesen in Excel muß man über Daten/AusText gegen, um die erweiterten Optionen zu haben.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 13:46
von Hans-Uwe
Habe dieses Beispiel gefunden:

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])
Damit bekomme ich einen IndexError. "List index out of range"

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 13:50
von __deets__
Ja, und wie sieht data nun aus? Kann hier ja keiner wissen :K

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 13:53
von Hans-Uwe
data ist die selbe Tabelle, die ich bisher benutzt habe. Normalerweise müsste 1.8 ausgegeben werden.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:02
von __deets__
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.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:15
von __deets__
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)

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:16
von Hans-Uwe
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])

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:20
von Hans-Uwe
__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)
pprint:

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];;;;;;;;;;;;;;;;;;;;;;;;;;;;;']]
Müsste also passen, da data[3][3] 1.8 enthält.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:29
von __deets__
Also ich sehe da eher, dass das ueberhaupt nicht passt. Kannst du mal die originale Datei irgendwo hinpacken (pastebin.com) und verlinken? Dann kann man sich dass mal ansehen.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:39
von Hans-Uwe

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:56
von __blackjack__
@Hans-Uwe: Die Datei passt nicht zum gezeigten Verhalten beim gezeigten Code. Also entweder hast Du nicht den Code ausgeführt den Du gezeigt hast, oder den hast Du auf einer anderen Datei ausgeführt.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 14:58
von kbr
@Hans-Uwe: Deine data-Werte kommen von hier:

Code: Alles auswählen

reader = csv.reader(x, delimiter=';')
data = list(csv.reader(x))
Du liest also zunächst korrekt ein, dann schmeisst Du alles weg und liest erneut mit dem Default-Separator ','. Daher ergibt data[3][3] einen IndexError, weil da eben nichts steht.

Ab hier verwendest Du csv.reader() richtig

Code: Alles auswählen

import csv

werte = []

reader = csv.reader(open("H:\\Simulation\\Phosphor_Kennwerte2.csv"), delimiter=';')
scheinst aber mit den gelieferten Objekten (zunächst 'reader' und später 'werte') nicht zurecht zu kommen und postest hier die älteren Inhalte von data. Du wirfst da einiges durcheinander.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 15:13
von Hans-Uwe
__blackjack__ hat geschrieben: Freitag 29. Juni 2018, 14:56 @Hans-Uwe: Die Datei passt nicht zum gezeigten Verhalten beim gezeigten Code. Also entweder hast Du nicht den Code ausgeführt den Du gezeigt hast, oder den hast Du auf einer anderen Datei ausgeführt.
@__blackjack__: Ich bin mir ziemlich sicher, dass ich immer genau beschrieben habe was ich gemacht habe. Dieser Code liefert einen IndexError; Phosphor-Kennwerte2.csv enthält exakt die Werte die ich oben als Liste mit pprint ausgegeben habe.

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])
kbr hat geschrieben: Freitag 29. Juni 2018, 14:58 Ab hier verwendest Du csv.reader() richtig

Code: Alles auswählen

import csv

werte = []

reader = csv.reader(open("H:\\Simulation\\Phosphor_Kennwerte2.csv"), delimiter=';')
scheinst aber mit den gelieferten Objekten (zunächst 'reader' und später 'werte') nicht zurecht zu kommen und postest hier die älteren Inhalte von data. Du wirfst da einiges durcheinander.
@kbr: Ich verstehe nicht ganz was du meinst. 'reader' ist der reader, der die Werte in die Liste 'werte' überträgt. Die Inhalte von data waren nie alt, die waren und sind immernoch die selben. Oder verstehe ich dich jetzt falsch? Mit der zweiten Methode, zu der du auch sagst, dass ich sie richtig verwenden, klappt ja auch alles wunderbar. Einzig und allein der String für 'wavelengthshift' wird (wieso auch immer?) einfach nicht an die Simulationssoftware übergeben. Die anderen Parameter werden wunderbar verbarbeitet.

Re: .csv Trennzeichendilemma

Verfasst: Freitag 29. Juni 2018, 15:18
von Hans-Uwe
__blackjack__ hat geschrieben: Freitag 29. Juni 2018, 14:56 @Hans-Uwe: Die Datei passt nicht zum gezeigten Verhalten beim gezeigten Code. Also entweder hast Du nicht den Code ausgeführt den Du gezeigt hast, oder den hast Du auf einer anderen Datei ausgeführt.
Hier ist zu sehen, was eins zu eins passiert:

https://ibb.co/m7KxNJ