Seite 1 von 3

.csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 16:05
von Hans-Uwe
Hi,

ich habe ein ganz doofes Problem.

Ich arbeite immernoch mit der Software Zemax OpticStudio, die ich per Python-Script bedienen möchte. Für Zemax möchte ich Parameter aus einer .csv auslesen. Mein Problem ist folgendes: Die Parametereingabe der Float-Kommastellen muss mit einem Punkt erfolgen (bspw. 1.8 ) - Zemax kann das nicht anders. Teilweise müssen die Parameter aber auch als String mit Kommata und einem Semikolon am Ende eingegeben werden (bspw. '1,2,1;'). Blöderweise wird meine deutsche .csv ja aber auch mit einem Semikolon getrennt. Wenn ich jetzt mein Windows auf das amerikanische System mit einer echten .csv-Kommatrennung umstelle, bekomme ich einen Error,

Code: Alles auswählen

wavelength1 = float(werte[13][3])
IndexError: list index out of range


ganz davon abgesehen, dass dabei der String '1,2,1;' auch wieder getrennt werden würde.

(Der Wert wavelength1 ist eine ganz normale Float, die im deutschen System tadellos funktioniert.)


Hat jemand hier eine Idee, wie ich das ganze geschickt umgehen kann?

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 16:29
von __blackjack__
@Hans-Uwe: Was ist denn hier das konkrete Problem? Gib beim `cvs`-Modul den `delimiter` an und gut ist.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 16:32
von Hans-Uwe
Achso, ich dachte dass Excel für sich auch schon das Semikolon als delimiter benutzt...

Ich muss mir jetzt erstmal meine Tabelle wieder reparieren. Die habe ich mir gerade beim Umstellen des Betriebssystems komplett zerschossen. :roll: :lol:

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 16:37
von __blackjack__
Deutsches Excel benutzt Semikolon als Trennzeichen. ”Englisches” Excel verwendet Kommas. Man muss die Datei mit dem Trennzeichen öffnen welches sie auch tatsächlich verwendet.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 16:45
von Hans-Uwe
Ja, das habe ich getan. Semikolon als delimiter verwendet. Dabei wird mir aber irgendwie der String '1,2,1;' zerpflückt.

Ich versuche es mal genauer zu beschreiben. Wenn ich das Skript einmal durchlaufen lasse ('1,2,1;' wird unter anderem ausgelesen und an die Software weitergeben) ist das Semikolon hinterher verschwunden und in der Zelle steht "1,2,1 (genau so wie es da steht mit den Anführungsstrichen). In der Zelle daneben wurde auch ein Anführungszeichen eingefügt. So hatte ich irgendwie in verdacht, weil das Semikolon verschwunden ist, dass irgendwas mit dem Trennzeichen von Excel nicht stimmen könnte.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 16:57
von __blackjack__
Von was für Zellen sprichst Du jetzt? Das klingt mir eher nach einer Software die nichts mit Quotezeichen, also normalerweise ", anfangen kann, denn in der Datei steht an der Stelle ja für die Zelle "1,2,1;" um das Semikolon *in* der Zelle von den Semikolons unterscheiden zu können die als Trennzeichen verwendet werden.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:04
von Hans-Uwe
Ich spreche von den Excel-Zellen. In der entsprechenden Zelle steht am Anfang nur 1,2,1; (Die ' habe ich nur gerade zur Markierung verwendet). Anschließend, nach einem Durchlauf des Scripts steht in der Zelle "1,2,1. In der Zelle daneben ein ". Das komische dabei ist auch, dass ich in dem Script Python an der Stelle lediglich anweise etwas auszulesen. Wieso er dann die die Zelle verändert und die benachbarte überschreibt - keine Ahnung.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:11
von Sirius3
@Hans-Uwe: Es wird nicht einfach eine Datei geändert, wenn man sie einliest. Zeig doch mal den kompletten Python-Code den Du verwendest und ein Beispiel-CSV-Datei und beschreibe genau, was Du dann machst.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:14
von Hans-Uwe
Genau das dachte ich ja auch und habe versucht die Datei-Einstellungen anzupassen.

Wenn ich die Tabelle morgen repariert habe, lade ich davon mal einen Screenshot hoch und stelle den Code hier ein.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:34
von Hans-Uwe
Habs schon halbwegs hinbekommen...

https://ibb.co/dPfn4o (Screenshot der Tabelle)

und hier ist der Code:

Code: Alles auswählen

import sys
PyZDDEPath = 'C:\PyZDDE'  # Assuming PyZDDE was unzipped here!
  
if PyZDDEPath not in sys.path:
    sys.path.append(PyZDDEPath)

import os as os
import pyzdde.arraytrace as at
import pyzdde.zfileutils as zfu
import pyzdde.config as _config
import pyzdde.zdde as pyz
import csv

### 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])
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])

##Wavelength
wavelength1 = float(werte[13][3])
wavelength2 = float(werte[14][3])


###bla bla bla. Den mittleren Teil habe ich mal ausgelassen. Da klappt alles.###


###Read Detector Viewer I
power = ln.zNSCDetectorData(surfNum=1, detectNum=4, pixel=0, dtype=0)


###Write Data
werte[16][3] = power

with open('H:\\Simulation\\Phosphor_Kennwerte1.csv', 'wb') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerows(werte)


###
ln.close()

print('Done')
Damit gab es folgendes Problem:

1. Ich lese den String 1,2,1; aus
2. Der String wird an die Software übergeben und dort ordnungsgemäß verarbeitet
3. Die Zelle der .csv-Tabelle, in der der String 1,2,1; stand, wurde so verändert: "1,2,1;. In der Zelle daneben wurde ein " eingefügt.
4. Ein weiterer Durchlauf des Scripts war ohne Anpassung des Strings nicht möglich, weil die Software nicht mit dem " vor der 1 umgehen kann und dieses Semikolon von 1,2,1; zwingend braucht.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:38
von ThomasL
Ich habe nicht den ganzen Thread gelesen aber ich würde mich fragen, warum eine Zelle in einer csv-Tabelle verändert wird, wenn die Daten nur "ausgelesen" werden.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:43
von Hans-Uwe
ThomasL hat geschrieben: Donnerstag 28. Juni 2018, 17:38 Ich habe nicht den ganzen Thread gelesen aber ich würde mich fragen, warum eine Zelle in einer csv-Tabelle verändert wird, wenn die Daten nur "ausgelesen" werden.
Hans-Uwe hat geschrieben: Donnerstag 28. Juni 2018, 17:04 Wieso er dann die die Zelle verändert und die benachbarte überschreibt - keine Ahnung.
Eigentlich habe lese ich doch am Anfang des Codes ein paar Werte aus und am Ende schreibe ich einen Wert zurück in eine ganz bestimmte Zelle der Tabelle.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:49
von ThomasL
Dann scheint ja irgendetwas beim zurück schreiben in die Tabelle nicht richtig zu funktionieren.
Kannst du dazu Code liefern oder steht der schon oben gepostet.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 17:50
von Hans-Uwe
Der steht schon oben:

Code: Alles auswählen

###Read Detector Viewer I
power = ln.zNSCDetectorData(surfNum=1, detectNum=4, pixel=0, dtype=0)


###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: Donnerstag 28. Juni 2018, 18:07
von ThomasL
wie sieht denn werte[16][3] vor und nach der Zuweisung von power aus?

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 18:29
von kbr
@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.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 18:33
von Sirius3
@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.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 18:34
von Hans-Uwe

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 18:42
von Hans-Uwe
Diese Ein- und Auslesezeilen habe ich aus einem Youtube Tutorial. :roll:
kbr hat geschrieben: Donnerstag 28. Juni 2018, 18:29 Und dabei berücksichtigst Du nicht die Quotation-Marks ("), welche die Separatoren innerhalb einer Zelle schützen.
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...
Sirius3 hat geschrieben: Donnerstag 28. Juni 2018, 18:33
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.
Ist Vorgabe von dieser bescheuerten Software-Erweiterung PyZDDE.

Re: .csv Trennzeichendilemma

Verfasst: Donnerstag 28. Juni 2018, 18:44
von Sirius3
Nein, das sind keine Vorgaben von PyZDDE.

Wie sind denn Deine csv-Import und -Exporteinstellungen in Excel?