Seite 1 von 1

Daten in .txt-Datei schreiben - Problem

Verfasst: Dienstag 16. Januar 2018, 16:55
von Hans-Uwe
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

Re: Daten in .txt-Datei schreiben - Problem

Verfasst: Dienstag 16. Januar 2018, 17:49
von eckhard
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

Re: Daten in .txt-Datei schreiben - Problem

Verfasst: Dienstag 16. Januar 2018, 18:00
von Hans-Uwe
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.

Re: Daten in .txt-Datei schreiben - Problem

Verfasst: Mittwoch 17. Januar 2018, 14:48
von Hans-Uwe
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...

Re: Daten in .txt-Datei schreiben - Problem

Verfasst: Mittwoch 17. Januar 2018, 15:02
von Sirius3
@Hans-Uwe: ... naja, in dem Du in der Ausgabe die Spalten mit `,` oder `;` trennst.

Re: Daten in .txt-Datei schreiben - Problem

Verfasst: Mittwoch 17. Januar 2018, 15:06
von Hans-Uwe
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

Re: Daten in .txt-Datei schreiben - Problem

Verfasst: Mittwoch 17. Januar 2018, 15:26
von narpfel
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.

Re: Daten in .txt-Datei schreiben - Problem

Verfasst: Mittwoch 17. Januar 2018, 15:50
von Hans-Uwe
@narpfel: Danke für den Tipp. Mal gucken ob ich das gebrauchen kann.