我正在使用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__
,import
和print_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
。
谢谢!
答案 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 = []