Reihe einlesen

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
Alex3262
User
Beiträge: 2
Registriert: Montag 19. November 2012, 08:32

Hallo!

Ich möchte gern ein Phytonskript verändern.
Mein Programm liest zurzeit einen Startwert, einen Endwert und die Schrittgröße ein.
Ich möchte aber eine Zahlenreihe vorgeben, also statt „1 2 3 4 5“ „1.2 2.1 3.0 4.5 5“.
Meine Zahlenreihe würde ich in J.dat speichern.
Folgende Ausgangssitiation habe ich:

Code: Alles auswählen

# Berechnungsbereich (J-Werte alle mit Faktor 10 angeben!!)
jstart = int(sys.argv[3])
jend = int(sys.argv[4])
jinc = int(sys.argv[5])

…
…

for j in range (jstart,jend+1,jinc):
  n = float(j)/10
  jfile = open("J%s.pcl" %n, "w")
  jfile.write("<poti_control caption=\"noName\"> \n")
  jfile.write("<float name=\"J\" value=\"%s\" /> \n" % str(n))
  jfile.write("</poti_control>\n")
  jfile.close()
  list = []
  cmd = ["/../Programm", "J%s.pcl" %n, "%s.pcl" %name, "-noGui"]
  subprocess.call(cmd)
  os.remove("J%s.pcl" %n)
  
  if (n%1) == 0.0:
    n = int(n)
    
  input = open("result_%s_%s.res" % (folder, n), "r") # Hier noch Dateinamen variabel machen

  for line in input:
    column=line.split()
    list.append(column)

------------------------------------------------ Mein Vorschlag-----------------------

Code: Alles auswählen

# Berechnungsbereich (J-Werte alle mit Faktor 10 angeben!!)
jstart = int(sys.argv[3])
jend = int(sys.argv[4])
jinclist =[]
jinc=open("J.dat","r")
for line in jinc:
  column=line.split()
  jinclist.append(column)
  jinc.close()
…
…
for j in range (jstart,jend+1,1):
  n = float(jinc[j][1])/10
  jfile = open("J%s.pcl" %n, "w")
  jfile.write("<poti_control caption=\"noName\"> \n")
  jfile.write("<float name=\"J\" value=\"%s\" /> \n" % str(n))
  jfile.write("</poti_control>\n")
  jfile.close()
  list = []
  cmd = ["/../Programm", "J%s.pcl" %n, "%s.pcl" %name, "-noGui"]
  subprocess.call(cmd)
  os.remove("J%s.pcl" %n)
  
  if (n%1) == 0.0:
    n = int(n)
    
  input = open("result_%s_%s.res" % (folder, n), "r") # Hier noch Dateinamen variabel machen

  for line in input:
    column=line.split()
    list.append(column)
---------------------------------------------------------------------------------
Fehlermeldung: Traceback (most recent call last):
File "01_auxfiles/ffd.py", line 36, in <module>
for line in jinc:
ValueError: I/O operation on closed file


Ich hoffe, dass die Informationen reichen.

Wo ist mein Denkfehler? Wieso kann man das so nicht machen?

Lieben Dank

Alex
Zuletzt geändert von Anonymous am Dienstag 20. November 2012, 09:52, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Alex3262: Erkläre mal Schritt für Schritt was diese Schleife macht. Dann solltest Du selber drauf kommen wo der Fehler liegt.
Alex3262
User
Beiträge: 2
Registriert: Montag 19. November 2012, 08:32

Code: Alles auswählen

jstart = int(sys.argv[3])         -> liest Startwert ein
jend = int(sys.argv[4])           -> liest Endwert ein
jinclist =[]                              
jinc=open("J.dat","r")               -> schreibt die Werte aus meiner J.dat liest in jinc
for line in jinc:
  column=line.split()
  jinclist.append(column)
  jinc.close()

for j in range (jstart,jend+1,1):        ---> SChleife von Startwert bis Endwert in einer Schritt
  n = float(jinc[j][1])/10                 ---> n=  Wert aus Liste 
  jfile = open("J%s.pcl" %n, "w")

So ist mein Gedanke. :(
Zuletzt geändert von Anonymous am Dienstag 20. November 2012, 10:05, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
sparrow
User
Beiträge: 4600
Registriert: Freitag 17. April 2009, 10:28

Könntest du bitte den Code in Python-Tags setzen, so wie es BlackJack in deinem ersten Beitrag getan hat? Ansonsten geht die Einrückung verloren, und die ist bei Python sehr wichtig.

Edit: Oh, Black Jack war ja so freundlich. Du solltest auch die fehlenden Reihen noch kommentieren.
BlackJack

@Alex3262: Es wäre besser wenn Du den Quelltext im Beitrag in (Python-)Code-Tags setzt, denn sonst geht in der Anzeige die Einrückung verloren, und die ist wichtig zum Verständnis. Und insbesondere wichtig für die Ausnahme, die Du bekommst.

Der Traceback zeigt Dir die Zeile wo Du versuchst aus einer geschlossenen Datei zu lesen. Und zwar ist das die erste ``for``-Schleife. Diese Schleife ist das Problem. Stell Dir mal vor Du hast 2 Werte in der Datei. Was passiert jetzt Schritt für Schritt beim Verarbeiten dieser Datei mit der ersten Schleife?

Wenn der Fehler behoben ist, wirst Du in weitere laufen. Die damit zu tun haben, dass Du eine falsche Vorstellung davon hast wie `jinclist` aussieht und wie man auf Listenelemente zugreift. Oder ich habe die falsche Vorstellung wie der Dateiinhalt aussieht.

`j` in der zweiten Schleife wird überflüssig wenn Du über die Werte einer Liste iterieren möchtest. Das macht man in Python *direkt* in der Schleife, ohne den Umweg über einen Index. Wenn man den zusätzlich zu den Elementen benötigt, dann gibt es die `enumerate()`-Funktion.

Die Angabe von Start- und Endwert an der Kommandozeile ist redundant wenn man die Werte übergibt, denn wie viele das sind, kann man die Liste ja mit `len()` fragen.
Antworten