2015-11-19 1 views
0

J'ai trois tableaux de données. Je veux les boucler et enregistrer les valeurs dans un fichier temporaire si certaines conditions sont remplies. Si la condition n'est pas remplie je voudrais ouvrir le fichier temorary et trouver l'index de la valeur maximale puis enregistrer dans un autre fichier. Lorsque j'essaie le code ci-dessous, je reçois cette erreur. C'est mon premier temps en utilisant tempfile.NamedTemporaryFile() donc je peux très bien ne pas l'utiliser correctement. MerciAjout d'un fichier temporaire dans une boucle for

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 

Mon 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() 
+1

Utilisez le mode r + pour lire et écrire dans le même fichier texte. http://stackoverflow.com/a/15976014/3182836 – binarysubstrate

Répondre

1

Lorsque vous avez créé votre fichier temporaire, vous lui avez attribué à ajouter des données au fichier. C'est une opération d'écriture. Si cela semble échouer, vous essayez de lire les données du fichier et de les mettre dans FT.

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

Changez TF en mode = 'r' et vous devriez avoir plus de chance.

+0

Ok, j'ai changé pour 'r +', mais maintenant je reçois un fichier vide. Je pense que ce qui se passe est que chaque fois que la boucle itère, le fichier est fermé et supprimé. Ce que je voudrais arriver est que le fichier temporaire soit ajouté, lu une fois que la boucle arrive au 'elsif' puis fermé et effacé. Y a-t-il un moyen de le faire? – Surfcast23

+0

NamedTemporaryFile fera exactement ce que vous décrivez. Il crée un fichier temporaire nommé aléatoirement qui sera supprimé après sa fermeture. –