分析生成器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]
)。