2016-12-26 8 views
1

ファイルの行数を数えようとしていますが、奇妙な結果が出ています。 MWEがあります下に、私はそれが自分自身のために話すと信じて:ファイル内の行数がファイルを消去します

file=open('Example.txt','r') 

print(sum(1 for line in file)) 
print(len(file.readlines())) 

私はこれを実行すると、私は出力X(右行数)と0を取得します。したがって、2番目の方法は機能していないか、空の変数を読み込むことです。私が注文を切り替えると、私は同じ結果になるので、何とか変数が消えてしまった。 file_1file_2を同じファイルに割り当てて、それぞれのメソッドを異なる変数で実行すると、XとXが得られます。そのため、アクションが完了した後で変数が消去されます。

"r"から"r+"に変更しようとしましたが、運がありません。誰かがここで何が起こっているのか説明できますか?リストを操作してもリストを変更すべきではありません。少なくともこれは私が教えたことです。

ありがとうございました!何が起こる

答えて

3

は次のとおりです。

print(sum(1 for line in file)) 

は、ファイルを読み込み、株を提供するイテレータを排出します。

あなたが、その後の操作を行います。

print(len(file.readlines())) 

イテレータが前の反復から排出されるので、あなたが0になってしまいます。もう一度反復処理を行うには、file.seek(0)を使用してください。

ファイルを読み取っているときには、'r'を使用する必要はありません。既定のモードです。一般的に


、あなたはイテレータがiter(obj) is objをチェックすることで、一度それを反復処理した後に排出されることを見つけることができます。

f = open('example.txt') 
print(iter(f) is f) # True 

このような場合は、につながる、その実装でobj.__iter__リターンself行動は目撃された。

ない場合、例えば、リストを取る:

l = [1, 2] 
print(iter(l) is l) # False 

__iter__方法は、複数回通って反復することができる(リストの場合、これはlist_iterator目的である)光沢のある新しいイテレータオブジェクトを返します。

+0

ありがとう、私はそのようなことが起こる可能性は考えていませんでした。このイテレータはどこに明示的に宣言されていますか?どのようにしてこの問題の対象になるのか分かりますか? CとMATLABでの私の経験では、イテレータをリセットする必要がありますが、Pythonでは内部的なプロセスだと本当に信じていました。 'r'は元のコードから残ったもので、私は 'r +'を使用しますが、メモに感謝します! – Alegom

+0

これは組み込みで、 'C 'で実装されています([' fileobject.c'](https://github.com/python/cpython/blob/master/Objects/fileobject.c)にあります) 。 'iter(obj)is obj'をチェックすることで、イテレータが一度反復処理された後、イテレータが使い尽くされていることが分かります。これが当てはまる場合、 'obj .__ iter__'はその実装で' self'を返し、動作を目撃します。そうでない場合、 '__iter__'メソッドは、複数回繰り返すことができる光沢のある新しいイテレータオブジェクトを返します。@Alegom –

+0

このイベントをいつ見なければならないのですか?この場合、私のファイルは15行でした。イテレータがすぐに疲れてしまうのを誰が知っていたのですか? – Alegom

関連する問題