2017-12-13 10 views
2

私はpythonソースファイルを処理するためにpython tokenizeモジュールを使用しています。以下のコードは次のようになります。pythonトークナイザの各行の後での操作方法

raw_list = [] 
words_list = [] 
g = tokenize.generate_tokens(file.readline) 
for toknum, tokval, _, _, line in g: 
    if toknum == tokenize.NAME and tokval not in PYTHON_KEYWORD: 
     words_list.append(tokval) 

私はline変数を使用して、現在の行を参照することができます知っています。各行の後にwords_listraw_listに追加したいと思います。どうやってやるの?具体的には、line値が変更された後に毎回追加アクションを実行するにはどうすればよいですか?

私はnextメソッドを使用することを考えていますが、それを行うためのきれいな方法はありません。

from __future__ import print_function 

と4つのトークンがあります:from__future__import、およびprint_functionは、例えば

は私の入力ソース・ファイルは一つだけの行が含まれていると。現在、gで、各トークンに対して、「トークンタイプ」、「トークンストリング」、「(srow、scol)」、「(erow、ecol)」の5タプルが返されます。例えば、トークン__future__

NAME, (1,2), (1,5), "from __future__ import print_function" 

"from __future__ import print_function"を変数lineに読み込まれる必要があります。今、__future__print_functionの両方がline変数を "from __future__ import print_function"に設定します。 __future__print_functionだけがpython予約キーワードではないため、words_list['__future__', 'print_function']になります。

words_listraw_listに追加するには、lineの値が変更された場合(つまり、次の行の文字列)の場合のみ、私の質問に従ってください。

ありがとうございます!

+0

'raw_list.append(word_list)' ???おそらくループの中で 'word_list'を初期化するでしょうか? –

+0

@ juanpa.arrivillaga別の 'line'に到達するたびに' word_list'を追加しようとしました。私は確かに毎回追加したくありません。 – zack

+0

...どういう意味ですか?各反復は異なる行ですので、各反復の最後に追加します。いいえ?おそらく、あなたがダミーのソースコードを作成して、入力/期待出力を示すことができれば、それは簡単でしょう。そうでなければ、 –

答えて

2

ありがとう@juanpa.arrivillaga素晴らしい答え。明示的にtokenize.NEWLINEの作品をチェックしてください。コードは以下のようになります:

raw_list = [] 
words_list = [] 
g = tokenize.generate_tokens(file.readline) 
for toknum, tokval, _, _, line in g: 
    if toknum == tokenize.NAME and tokval not in PYTHON_KEYWORD: 
     words_list.append(tokval) 
    if toknum == tokenize.NEWLINE: 
     raw_list.append(words_list) 
     words_list = [] 
関連する問題