Daten in .txt-Datei schreiben - Problem

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

Hi,

ich bin neu hier im Forum, aber vor allem auch in der Programmierung (mit Python).

Ich bin gerade dabei meine Bachelorarbeit über ein Python-Script zu schreiben, mit dem ich eine optische Simulation mit dem Programm "Zemax OpticStudio" mit einer Thermo-Simulation über Abaqus koppeln möchte. Nur so für euch zur Orientierung. Für mein eigentliches Problem ist das nicht so wichtig.

Ich habe Beispielscripte (https://github.com/indranilsinharoy/PyZ ... n-article)) gefunden, mit denen man Beispielsimulationen per Zemax ablaufen lassen kann.

Dabei werden in einer Simulationen die Ergebnisse in eine .txt-Datei geschrieben:

Code: Alles auswählen

# trace the rays
ret = at.zArrayTrace(rd, timeout=5000)

# write the ray trace data into a file
outputfile = "C:\\tmp\\arrayTraceOutput.txt"
if ret==0:
    k = 0
    with open(outputfile, 'w') as f:
        f.write("Listing of Array trace data\n")
        f.write("{:^7} {:^7} {:^7} {:^15} {:^15} {:^9} {:^9} {:^9} {:^6}"
                " {:^7} {:^7} {:^7} {:^7} {:^7} {:^7} {:^7}\n"
                .format('px', 'py', 'error', 'xout', 'yout', 'l', 'm', 'n', 
                        'opd', 'Exr', 'Exi', 'Eyr', 'Eyi', 'Ezr', 'Ezi', 'trans'))
        for i in xrange(-radius, radius + 1, 1):
            for j in xrange(-radius, radius + 1, 1):
                k += 1
                line = ("{:7.3f} {:7.3f} {:5d} {:15.6E} {:15.6E} {:9.5f} "
                        "{:9.5f} {:9.5f} {:7.3f} {:7.3f} {:7.3f} {:7.3f} "
                        "{:7.3f} {:7.3f} {:7.3f} {:7.4f}\n"
                        .format(i/(2*radius), j/(2*radius), rd[k].error,
                                rd[k].x, rd[k].y, rd[k].l, rd[k].m, rd[k].n,
                                rd[k].opd, rd[k].Exr, rd[k].Exi, rd[k].Eyr,
                                rd[k].Eyi, rd[k].Ezr, rd[k].Ezi, rd[k].intensity))
                f.write(line)
Später erfolgt in einem anderen Script die Ausgabe direkt in der IDLE:

Code: Alles auswählen

# Print the output
print("Listing of NSC Trace data:")
print("{:^4} {:^4} {:^4} {:^6} {:^4} {:^14} {:^14} {:^14} {:^12}"
      .format('seg#', 'Prnt', 'Levl', 'In', 'Hit', 'X', 'Y', 'Z', 'Intensity'))

totalSegments = len(rayData)
for i, seg in enumerate(rayData):
    segLevel = seg.segment_level
    segParent = seg.segment_parent
    insideOf = seg.inside_of
    hitObj = seg.hit_object
    x, y, z, l, m, n = seg.x, seg.y, seg.z, seg.l, seg.m, seg.n
    intensity = seg.intensity
    opl = seg.opl
    print("{:4d} {:4d} {:4d} {:4d} {:4d} {:15.6E} {:15.6E} {:15.6E} {:8.4f}"
           .format(i+1, segParent, segLevel, insideOf, hitObj, x, y, z, intensity))
Jetzt zu meinem Problem: Ich schaffe es nicht die Daten aus dem zweiten Script in eine .txt-Datei zu schreiben. Mein Ansatz sieht so aus:

Code: Alles auswählen

outputfile = "H:\\Listing of Array trace data.txt"

with open(outputfile, 'w') as f:
        f.write("Listing of Array trace data\n")
        f.write("{:^4} {:^4} {:^4} {:^6} {:^4} {:^14} {:^14} {:^14} {:^12}"
        .format('seg#', 'Prnt', 'Levl', 'In', 'Hit', 'X', 'Y', 'Z', 'Intensity'))


        for i, seg in enumerate(rayData):
            segLevel = seg.segment_level
            segParent = seg.segment_parent
            insideOf = seg.inside_of
            hitObj = seg.hit_object
            x, y, z, l, m, n = seg.x, seg.y, seg.z, seg.l, seg.m, seg.n
            intensity = seg.intensity
            opl = seg.opl

            line = ("{:4d} {:4d} {:4d} {:4d} {:4d} {:15.6E} {:15.6E} {:15.6E} {:8.4f}"
                .format(i+1, segParent, segLevel, insideOf, hitObj, x, y, z, intensity))

            f.write(line)
Damit werden die Messdaten alle in eine Zeile geschrieben. Ich schaffe es nicht die Simulationsdaten in eine Art Tabelle zu schreiben. Aussehen soll es in der .txt-Datei aber in etwa so:

Code: Alles auswählen

Listing of NSC Trace data:
seg#   Prnt     Levl    In    Hit       X               Y              Z          Intensity  
   1      0       1      0     2    0.000000E+00    0.000000E+00    5.000000E+00   1.0000
   2      1       2      2     2    1.435769E-01    0.000000E+00    5.500000E+00   0.3300
   3      2       3      0     3    4.307306E+00    0.000000E+00    2.000000E+01   0.3300
   4      1       2      2     2    0.000000E+00    0.000000E+00    5.500000E+00   0.3300
   5      4       3      0     3    0.000000E+00    0.000000E+00    2.000000E+01   0.3300
   6      1       2      2     2   -1.435769E-01    0.000000E+00    5.500000E+00   0.3300
   7      6       3      0     3   -4.307306E+00    0.000000E+00    2.000000E+01   0.3300
   8      1       2      0     0    5.520000E-01    0.000000E+00    3.077685E+00   0.3300
   9      1       2      0     0    0.000000E+00    0.000000E+00    3.000000E+00   0.3300
  10     1       2      0     0   -5.520000E-01    0.000000E+00    3.077685E+00   0.3300
Ich würde mich sehr freuen wenn mir hier geholfen wird! :)

Liebe Grüße
Robert
eckhard
User
Beiträge: 33
Registriert: Montag 14. Dezember 2015, 10:06
Wohnort: Karlsruhe

Hallo Hans-Uwe
ein \n für neue Zeile in Deiner drittletzten Zeile, so wie bei
"Listing of Array Trace Data\n"
wird Dir wahrscheinlich helfen. Write fügt einen Zeilenvorschub nicht von sich aus ein,
Eckhard
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Hi Eckhard,

funktioniert! :D

Ich habe an das \n gedacht, habe es aber in dem ersten Code, bei der die Ausgabe in einer Datei funktioniert, komplett übersehen und deshalb nicht ausprobiert. Ich dachte, dass es auch irgendwie anders gehen muss, bspw. über eine Variable, die nach jeder Zeile um 1 addiert wird und so eine neue Zeile beginnt.. Das habe ich aber nicht hinbekommen.

Vielen Dank! :)

Liebe Grüße
Robert

P.S.: Habe gerade erst die Codebox-Funktion hier gefunden, kann den Startbeitrag aber leider nicht mehr editieren. Sorry. :K Beim nächsten mal wirds schöner.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Hi,

ich habe jetzt noch das Problem, dass der Code die Simulationsdaten Zeilenweise in die erste Spalte hintereinander schreibt. Ich weiß, dass Excel die Zellen mit ",", ";" oder anderen Zeichen trennt - ich weiß aber nicht, wie ich das in den Code einbauen soll... :K

Code: Alles auswählen

outputfile2 = "H:\\Listing of Array trace data.csv"


with open(outputfile2, 'w') as f:
        f.write("Listing of Array trace data\n")
        f.write("{:^4} {:^4} {:^4} {:^6} {:^4} {:^14} {:^14} {:^14} {:^12}\n"
        .format('seg#', 'Prnt', 'Levl', 'In', 'Hit', 'X', 'Y', 'Z', 'Intensity'))
        

        for i, seg in enumerate(rayData):
            segLevel = seg.segment_level
            segParent = seg.segment_parent
            insideOf = seg.inside_of
            hitObj = seg.hit_object
            x, y, z, l, m, n = seg.x, seg.y, seg.z, seg.l, seg.m, seg.n
            intensity = seg.intensity
            opl = seg.opl

            line = ("{:4d} {:4d} {:4d} {:4d} {:4d} {:15.6E} {:15.6E} {:15.6E} {:8.4f}\n"
                .format(i+1, segParent, segLevel, insideOf, hitObj, x, y, z, intensity))

            f.write(line)
Ich habe ein Youtube-Tutorial gesehen, in dem eine Datensammlung erst in eine Liste geschrieben werden, um mit der dann die Zeilen und Spalten zu füllen. Ich bin aber noch nicht so gut, dass mal eben auf den Code von mir zu übertragen...
Sirius3
User
Beiträge: 17731
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hans-Uwe: ... naja, in dem Du in der Ausgabe die Spalten mit `,` oder `;` trennst.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Ich bin auch doof. Habe den Post gerade geschrieben, bevor ich es einfach mal versucht habe. Hat geklappt. :) Ich bin bei so neuen Themen immer vorsichtig und denke "Ach, kannste eh nicht...". Vielleicht helfe ich ja noch anderen, falls jemand nach diesem Problem sucht und dieses Thema hier findet. :D
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

je nach dem, was du mit den Daten machst, ist eventuell ein Blick auf das SciPy-Ökosystem sinnvoll. Das kann bei bestimmten Problemen nicht nur die Performance wesentlich verbessern, sondern ist oftmals auch kürzer und (wenn man sich dran gewöhnt hat) lesbarer, weil man sich es oft spart, Schleifen explizit zu schreiben.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

@narpfel: Danke für den Tipp. Mal gucken ob ich das gebrauchen kann.
Antworten