これはさまざまな方法があり、それぞれが異なる入力クラスに一般化されています(このように)。どの程度:
(あなたの3例のために)与え
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
:
['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は、line1の各単語にループし、/
で分割しようとします。それが3つの部分を生成するならば、それは日付だと仮定します。もしそうならば、日付の最後の部分が空でない場合は日付を返し、それ以外の場合は、単語とline2の最初の項の和を返します。これはline2を必要としない場合は使用しません。 line2.pop(0)
は、「行2の最初の要素を取り出して削除する」という意味です。
出典
2012-03-11 04:18:24
DSM
アメージング私はちょうどよ...この回答に投票するには新鮮すぎる!感謝し、多くを学んだ! –
質問、 日付=リスト(dates_from_two(行、次の行)) なぜあなたはdates_from_two()で "return"を定義しませんでしたが、この関数はwordを返しますか?キーワード "収穫"のため? –