2016-07-14 3 views
0

Le code ci-dessous a deux mêmes lignes, mais je pense que fr est déjà ouvert par la première ligne. J'essaye d'enlever les deuxièmes lignes, mais le code a échoué. Alors pourquoi avons-nous besoin du fichier ouvert chaque fois que nous l'utilisons?pourquoi python besoin d'ouvrir le fichier chaque fois que nous utilisons les données?

def file2matrix(filename): 
    fr = open(filename) #<------------------------- 
    numberOfLines = len(fr.readlines()) 
    returnMat = np.zeros((numberOfLines,3)) 
    classLabelVector = [] 
    fr = open(filename) # <------------------------ 
    index = 0 
    for line in fr.readlines(): 
     line = line.strip() 
     listFromLine = line.split('\t') 
     returnMat[index,:] = listFromLine[0:3] 
     classLabelVector.append(listFromLine[-1]) 
     index += 1 
    return returnMat, classLabelVector 
+0

Pourquoi avez-vous besoin le nombre de lignes? Vous ne semblez rien faire avec cette information ... – bernie

Répondre

1

Vous n'avez pas besoin de rouvrir le fichier, mais vous devez revenir au début.

La fonction readline() lit une ligne dans un fichier. Chaque fois que vous appelez readline(), le pointeur se déplace vers la ligne suivante. Readlines() appelle readline() jusqu'à ce qu'il arrive à la fin du fichier. Si vous voulez revenir au début, vous devez rouvrir le fichier. (En général, il est préférable de fermer le fichier et de le rouvrir, même si vous ne lisez qu'une seule fois, vous devez fermer le fichier à la fin.)

Si vous ne souhaitez parcourir qu'une seule fois le fichier peut compter le nombre de lignes que vous parcourez dans le fichier, puis renvoyer ce nombre.

Original:

def file2matrix(filename): 
    fr = open(filename) 
    numberOfLines = len(fr.readlines()) 
    returnMat = np.zeros((numberOfLines,3)) 
    classLabelVector = [] 
    fr = open(filename) 
    index = 0 
    for line in fr.readlines(): 
     line = line.strip() 
     listFromLine = line.split('\t') 
     returnMat[index,:] = listFromLine[0:3] 
     classLabelVector.append(listFromLine[-1]) 
     index += 1 
    return returnMat, classLabelVector 

Une autre façon:

def file2matrix(filename): 

    fr = open(filename) 

    classLabelVector = [] 

    index = 0 
    line = '' 
    numberOfLines = 0 

    while line is not None: 

     numberOfLines += 1 

     line = fr.readline() 
     listFromLine = line.split('\t') 

     returnMat[index,:] = listFromLine[0:3] 
     classLabelVector.append(listFromLine[-1]) 

     index += 1 

    fr.close() 

    returnMat = np.zeros((numberOfLines,3)) 
    return returnMat, classLabelVector 
+0

Dans votre * autre façon *, '' 'returnMat [index ,:] = listFromLine [0: 3]' '' sur cette ligne qu'est-ce que '' ' returnMat'''? Et pourquoi vous attribuez-vous quelque chose de différent après que vous l'ayez simplement rempli? – wwii

+0

Bon point. Je ne suis pas sûr de ce que l'OP essayait de faire, donc je voulais donner les deux options pour returnMat. – Yaelle

+0

@wwii, returnMat [index,:] = listFromLine [0: 3], cette ligne est juste pour la nature de mon ensemble de données, pas d'utilisation pour un autre programme. Mon dataset est au format txt, chaque ligne contient 3 caractéristiques et la dernière est label, c'est pour ça que je l'ai assigné. Et les zéros dans l'ancien sont juste pour initialiser le returnMat, comme la définition variable – user291026