有很多方法可以做到这一点,每一种方法都可以推广到不同类别的输入 - 就像这样。如何:
def dates_from_two(line1, line2):
line2 = line2.split()
for word in line1.split():
wsplit = word.split('/')
if len(wsplit) == 3:
yield word if wsplit[-1] else (word + line2.pop(0))
with open("period.txt") as fp:
lines = fp.readlines()
for i, line in enumerate(lines):
if line.startswith("Period End Date"):
next_line = lines[i+1] if i+1 < len(lines) else ''
dates = list(dates_from_two(line, next_line))
print dates
这给(你的3起):
['09/30/2012', '06/30/2012', '03/31/2012', '12/31/2011', '09/30/2011']
['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2010', '09/30/2012']
['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2011', '09/30/2012']
基本上,上面写明所有的线到内存(不是必须的,但更简单,如果文件不是太大)并在其上循环,寻找以“期末日期”开头的行。如果它找到一个,它将发送该行,而下一个发送到dates_from_two。
dates_from_two只是简单地遍历第1行中的每个单词并尝试将其按/
拆分。如果这产生三个部分,我们将假定它是一个日期。如果是这样,那么如果日期的最后一部分是非空的,那么我们就得出日期,否则我们得出该单词加上第一行的总和(我们弹出)。如果我们从不需要行2,我们就不会使用它。请注意,line2.pop(0)
表示“采用line2的第一个元素,然后删除它”。
来源
2012-03-11 04:18:24
DSM
惊人......我只是太新鲜了,无法投票回答这个问题!欣赏并学到很多东西! – 2012-03-11 04:45:48
问题, dates = list(dates_from_two(line,next_line)) 为什么你没有在dates_from_two()中定义“return”,但是这个函数返回的是单词?由于关键字“收益”?? – 2012-03-11 04:53:20