2011-06-29 5 views
0

私はPython 3でループするときに問題を解決しようとしていました。 サブルーチンから戻ってくるとき、 "line"変数はインクリメントされません。Pythonでループし、サブルーチンの後にカレント行を保持する

サブルーチンから最新のreadlineを返すようにスクリプトを取得するにはどうすればよいですか?

コード

def getData(line): 
     #print(line) 
     #while line in sTSDP_data: 
     while "/service/content/test" not in line: 
      line = sTSDP_data.readline() 

import os, sys 

sFileTSDP = "d:/ess/redo/Test.log" 
sTSDP_data = open(sFileTSDP, "r") 

for line in sTSDP_data: 
     if "MOBITV" in line: 
      getData(line) #call sub routine 
      print(line) 

の下に、私は大容量のファイルを通って、私はデータの次の5(または100)のラインを処理するサブルーチン を呼び出す必要がある特定の文字列を踏みました。サブルーチンが完了してメインプログラムに戻るときは、メインプログラムの最後のリードラインではなく、サブルーチンの最後の readlineから継続する方がよいでしょう。

ダンの答えがトリックでした。

+0

これは奇妙で畳み込まれたスクリプトです。それが何をすべきかを教えてくれるのですか? –

+1

Daanの答えがあなたを助けてくれたら、(投票の左にある上向きの矢印をクリックして)upvotingし、それを正解としてマークしてください(votecountのちょっとしたチェックマークにチェックを入れてください)。 –

答えて

1

さて、割り当ては参照では機能しません。つまり、ある関数で変数を代入すると、別の関数の値は変更されません(特定の例外(globalnonlocalなど)がない限り)。 (リストを変更すると、リストへのすべての参照が "変更"されます)。

だけのgetData(行)の終わり

def getData(line): 
     #print(line) 
     #while line in sTSDP_data: 
     while "/service/content/test" not in line: 
      line = sTSDP_data.readline() 
     return line 
3

return lineを置くどのようにreturn文を使用してはどうですか?

def getData(line): 
     #print(line) 
     #while line in sTSDP_data: 
     while "/service/content/test" not in line: 
      line = sTSDP_data.readline() 
     return line 

import os, sys 

sFileTSDP = "d:/ess/redo/Test.log" 
sTSDP_data = open(sFileTSDP, "r") 

for line in sTSDP_data: 
     if "MOBITV" in line: 
      line = getData(line) #call sub routine 
      print(line) 

変数の範囲に注意してください。あなたのgetData関数の 'line'はループの 'line'と同じではありません。