2016-07-14 4 views
0

以下のコードは同じ行ですが、frはすでに最初の行で開かれていると思います。私は2行目を削除しようとしましたが、コードは失敗しました。だから、私たちがそれを使うたびにオープンファイルを必要とするのはなぜですか?なぜ私たちがデータを使うたびにファイルを開く必要があるのですか?

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

?あなたはその情報で何もしているようには見えません... – bernie

答えて

1

あなたは、ファイルを再度開く必要はありませんが、あなたは最初に戻っする必要があります。

readline()関数はファイル内の行を読み取ります。 readline()を呼び出すたびに、ポインタは次の行に移動します。

readlines()は、ファイルの最後に到達するまでreadline()を呼び出します。最初に戻したい場合は、ファイルを再度開く必要があります。 (実際にファイルを閉じてからもう一度開くことをお勧めします。最後にファイルを閉じる必要があります。)

ファイルを一度しか通過させたくない場合は、ファイルを移動するときに行数を数えてから、その数を返すことができます。

オリジナル:

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 

別の方法:あなたが行数が必要なのはなぜ

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

*あなたの*他の方法では、 '' 'returnMat [index ,:] = listFromLine [0:3]' ''この行に '' ' returnMat'''?そしてなぜあなたはなぜあなたが明らかにそれをいっぱいにした後に別のものを割り当てるのですか? – wwii

+0

良い点。私はOPが何をしようとしているのか分からないので、私はreturnMatの両方のオプションを与えたいと思っていました。 – Yaelle

+0

@wwii returnMat [index、:] = listFromLine [0:3]、この行は、私のデータセットの性質上のものであり、他のプログラムのためのものではありません。私のデータセットはtxtフォーマットであり、各行には3つのフィーチャデータがあり、最後のものはラベルです。そのため、私はそれに割り当てます。前者のゼロは、変数定義のようにreturnMatを初期化するためのものです – user291026

関連する問題