2009年3月12日木曜日

mlのアーカイブからなんかを抽出する(1)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
まずは準備。mboxをローカルにコピー。wgetのオプション考えたくなかった。



import urllib
import re

yearmonth = re.compile(r'\d\d\d\d-\d\d')

base = 'ftp://lists.gnu.org/bug-gnubg/'

for line in urllib.urlopen(base):
xs = yearmonth.findall(line)
if xs:
ym = xs[0]
print ym, '->', base + ym
f = open(ym, 'w')
f.write(urllib.urlopen(base+ym).read())
f.close()


意味が無いが、これをあとから作るものと組み合わせれば、on the flyでnetworkからとってくるようにもかける。いまやるのは単にdebugのrep loopが長くなるだけ。

mutlifileとfileinputがそれっぽく見える。multifileは1→多、fileinputは多→1なので、今回は後者。seekableであることが要求されているのでそこをなんとかしないといけない。seekが無いようだ。で、拡張できないか fileinputのソースを見てみる。



def readline(self):
try:
line = self._buffer[self._bufindex]
except IndexError:
pass
else:
self._bufindex += 1
self._lineno += 1
self._filelineno += 1
return line

なんかコテコテに行志向です。無理がありそうなのでscrachするか、探すかですが、昨日探した感じではうまく見つけられず。まあ、そろそろ作ることを考えたほうがいいかもしれない。方針としては、userから触れるwindow bufferを用意して、必要に応じて実体のfileから読み込むのがいいかな。どの実体のどのoffesetかという情報ともつか。

あとはcatして標準入力からもらう。問題点としてはどのfileだったかわからなくなる、メモリかな。catしてfile作ってみたけど、89,259,554 byteかぁ。。。びみょー。



import email
import mailbox

f= open('all')
mbox = mailbox.UnixMailbox(f, email.message_from_file)
print mbox
for msg in mbox:
print msg['Date']
f.close()

んで、一体いくつメールがあるかというと、

[nori@asama]~/Desktop/work/gnubg/bug-ml% python find_position.py | wc
13865 83325 441602

とりあえずは富豪的に、複数Fileをラップする話は動くようになってから考えよう。

0 件のコメント: