Search code examples
loopspython-3.xtemp

Appending a temp file in a for loop


I have three arrays of data. I want to loop them over and save the values in a temporary file if some condition is meet. If the condition is not meet I would like to open the temorary file and find the index of the maximum value then save to another file. When I try the code below I get this error. This is my fist time using tempfile.NamedTemporaryFile() so I very well may not be using it correctly. Thanks

Traceback (most recent call last):

  File "<ipython-input-19-7c44ca7dcbd6>", line 1, in <module>
runfile('C:/Users/Khary/Documents/Astrophysics/Bolshoi/Halo Formation History Project/Codes/Find V_max.py', wdir='C:/Users/Khary/Documents/Astrophysics/Bolshoi/Halo Formation History Project/Codes')

  File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile
execfile(filename, namespace)

  File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 85, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)

  File "C:/Users/Khary/Documents/Astrophysics/Bolshoi/Halo Formation History Project/Codes/Find V_max.py", line 222, in <module>
formation_def()

  File "C:/Users/Khary/Documents/Astrophysics/Bolshoi/Halo Formation History Project/Codes/Find V_max.py", line 129, in formation_def
FT = np.loadtxt(TF,skiprows=0)

  File "C:\Anaconda3\lib\site-packages\numpy\lib\npyio.py", line 770, in loadtxt
first_line = next(fh)

UnsupportedOperation: not readable

My code

import numpy as np
import temp

#large arrays of data
Id = np.array([some size])
MASS = np.array([some size])
V = np.array([some size])



def filesave(MAS,V):     #Functioin to write and save values to file

 Mc = str(MAS)
 Vel = str(V)
 w.write(Mc)
 w.write('\t')
 w.write(Vel)
 w.write('\n')
 return()

 def formation_def():

 count = 1

 l =len(ID)
 for i in range(l):
   if ID[i] == count: 
     for j in range(i,l):
       TF = tempfile.NamedTemporaryFile(mode='a')
        if ID[j] <= ID[i]:
            T = str(ID[j])
            M =  str(MASS[j])
            Vel = str(V[j])
            TF.write(T)
            TF.write('\t')
            TF.write(M)
            TF.write('\t')
            TF.write(Vel)
            TF.write('\n') 
        elif ID[j]>ID[i]:      # if ID[j]>TID[i] then we are in the next halo in the list 
            FT = np.loadtxt(TF,skiprows=0)
            MASS2 = FT[:,0]
            V2 =    FT[:,2]
            vel_max = np.argmax(V2)
            filesave(MASS2[vel_max],V2[vel_max])
            TF.close()              
            count+=1           # and must indcrement the counter and break out of loop
            break           
    elif:
       count = ID[i]+1
 return()  

Solution

  • When you created your temporary file, you assigned it to append data to the file. That is a write operation.

    TF = tempfile.NamedTemporaryFile(mode='a')
    

    Where it seems to be failing, you are trying to read data from the file and put it in FT.

    FT = np.loadtxt(TF,skiprows=0)
    

    Change TF to mode='r' and you should have better luck.