.csv Trennzeichendilemma

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

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hans-Uwe: Was ist denn hier das konkrete Problem? Gib beim `cvs`-Modul den `delimiter` an und gut ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

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:
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Deutsches Excel benutzt Semikolon als Trennzeichen. ”Englisches” Excel verwendet Kommas. Man muss die Datei mit dem Trennzeichen öffnen welches sie auch tatsächlich verwendet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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

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

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

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)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

wie sieht denn werte[16][3] vor und nach der Zuweisung von power aus?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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

Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, das sind keine Vorgaben von PyZDDE.

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