分析生成器Python 2
输入: 脚本:分析生成器Python 2,python,parsing,generator,yield,Python,Parsing,Generator,Yield,输入: 脚本: @example1 abcd efg hijklmnopq @example2 123456789 输出 def parser_function(f): name = '' body = '' for line in f: if len(line) >= 1: if line[0] == '@': name = line conti
@example1
abcd
efg
hijklmnopq
@example2
123456789
输出
def parser_function(f):
name = ''
body = ''
for line in f:
if len(line) >= 1:
if line[0] == '@':
name = line
continue
body = body + line
yield name,''.join(body)
for line in parser_function(data_file):
print line
期望输出:
('@example1', 'abcd')
('@example1', 'abcdefg')
('@example1', 'abcdefghijklmnopq')
('@example2', 'abcdefghijklmnopq123456789')
我的问题是,我的发电机产生了每条线路,但我不确定在哪里重置线路。我很难得到想要的输出,我尝试了几种不同的方法。任何帮助都将不胜感激。看到其他一些发电机有“如果名称:”但它们相当复杂。我使用这些代码使其工作,但我正在尝试使我的代码尽可能小您需要更改您的
产生的位置
:
('@example1', 'abcdefghijklmnopq')
('@example2', '123456789')
这个在每个@…
之前产生一次s,在结尾产生一次
另外,我已将str
重命名为body
,以避免阴影出现。您需要更改您的屈服点
:
('@example1', 'abcdefghijklmnopq')
('@example2', '123456789')
这个在每个@…
之前产生一次s,在结尾产生一次
另外,我已将str
重命名为body
,以避免隐藏a。可能值得指出的是,不要将str
用作变量name@PadraicCunningham:说得好,让我在答案中加上这个。谢谢。什么是“如果行和行[0]='@'”?我理解行[0],但“如果行”不总是正确的吗?@draconisthory:本质上,如果行
检查行是否为空(这样我们就不会尝试在空行上执行行[0]
)。可能值得指出的是,不要将str
用作变量name@PadraicCunningham:说得好,让我在答案中加上这个。谢谢。什么是“如果行和行[0]='@'”?我理解行[0],但“如果行”不总是正确的吗?@draconisthory:本质上,if-line
检查行是否为空(这样我们就不会尝试在空行上执行line[0]
)。