2016-10-26 3 views
2

いくつかのテキストファイル(STL)を開き、前に定義した2つの関数を使っていくつかの操作を実行します。正確には、関数 "point_stl"はSTLファイルに含まれる点の座標を抽出し、関数 "point_cloud"はSTLファイルから点を繰り返し抽出しません。同じハンドラを使用してファイルを何度も読み取ることができないのはなぜですか?

with open(folder+"bone_set1.stl", "r") as f1, open(folder+"bone_set2.stl", "r") as f2: 
    var1 = point_stl(f1,f2) 
    var2 = point_cloud(f1,f2) 

なぜ私は変数f1とf2を2回使用できないように見えますか?私が最初の関数でそれらを使うと、私は2番目の関数で何の結果も得られませんし、その逆もあります。

+1

を渡し、これは 'WITH'の文とは何の関係もありません。オブジェクトのようなファイルはステートフルなので、ファイルポインタを開始位置に戻すことなく、2回連続して読み込むことはできません(回答に記載されています)。 – ShadowRanger

答えて

2

ファイルハンドラを直接渡すので、各関数がファイルの内容を読み込むと仮定します。

残念ながら、最初の関数がファイルを読み取った後、読み取りカーソルはファイルの最後にあり、2番目の関数はカーソルとファイルの終わりの間に何も読み込まれません。

私のアドバイスは、に次のようになります。

  • は最初
  • は、関数の代わりに、ファイルハンドラにファイルの内容を渡す(それらを呼び出す前)機能外のファイルを読み込みます。

他の解決策は、最初の関数呼び出しの後に開始されるファイルで読み取りカーソルを戻すことです。代わりに、ファイルポインタを渡すの

5

point_stlコール内のファイルをenに読み込んでいる可能性があります。 救済はpoint_cloudをcaling前に戻って位置0にファイルを模索することです:

with open(folder+"bone_set1.stl", "r") as f1, open(folder+"bone_set2.stl", "r") as f2: 
    var1 = point_stl(f1,f2) 
    f1.seek(0) 
    f2.seek(0) 
    var2 = point_cloud(f1,f2) 

をよりよく理解するために:Pythonでテキストファイルの最も一般的なユースケースは、各上のデータを操作する、行の後にラインを読むことですおそらくyoruコードがこれらの関数の中で何をしているのでしょうか?問題は、一度開いたファイルが、読み込まれた位置まで内部の "ポインタ"を保持し、次の呼び出しで読み込みを再開する点です。あなたの最初の関数はファイルを最後まで読み込んでいる可能性が高く、ポインタはファイルの最後にあります。 2つ目の関数を呼び出すと、tehreは何も読み込まれません。

オペレーティングシステムのファイルへのアクセスには、ファイルポインタを任意の位置に置くことができる「シーク」機能があります。テキストファイルの場合は、先頭、末尾、または以前に格納された位置(別の変数内)で実行されます。 "0"でそれを呼び出すと、第2の( "whence")パラメータを抑制することで、両方のファイルが最初に巻き戻されます。

4

がちょうどf.read()を使用し、記録のために、ファイルの内容に

with open(folder+"bone_set1.stl", "r") as f1, open(folder+"bone_set2.stl", "r") as f2: 
    contentsf1 = f1.read() 
    contentsf2 = f2.read() 
    var1 = point_stl(contentsf1,contentsf2) 
    var2 = point_cloud(contentsf1,contentsf2) 
+0

私はcontentf1を1行ずつ読み込もうとすると、それぞれの文字が得られます。どのように行単位で読むことができますか?ファイルを1行ずつ読み込んでリストに格納する必要がありますか? – drSlump

+0

readlines()でそれを行いました – drSlump

関連する問題