如何在python tokenizer

时间:2017-12-13 00:19:34

标签: 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_list附加到raw_list。我怎样才能做到这一点?具体来说,每次line值更改后,如何执行追加操作?

我正在考虑使用next方法,但我没有看到任何干净的方法。

例如,

假设我的输入源文件只包含一行:

from __future__ import print_function

并且有四个令牌:from__future__importprint_function。现在,对于g,对于每个令牌,将返回5元组,即“令牌类型”,“令牌字符串”,“(srow,scol)”,“(erow,ecol)”。例如,令牌__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_list值更改时(即下一行字符串),才能将raw_list附加到line

谢谢!

1 个答案:

答案 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 = []