スライス記法、Python3.x、HTTP


Python3.1でHTTP通信

サーバ上のIRCのログファイルから特定の文字列を含む行を抽出してメール送信する.py
コンプライアンスに抵触しそうな部分は伏せてます。

import datetime
import urllib.request
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate


# 現在日付をyyMMddの形式で取得
today = str(datetime.date.today()).replace('-', '')[2:]

# 日付からログファイルのURLを生成
logUrl = 'http://******/' + today + '.log'

# HTTP接続
con = urllib.request.urlopen(logUrl)
logList = con.readlines()

# all:抽出
allMsg = ''
for line in logList :
	decoded = line.decode('utf-8')
	if decoded.find('all:') != -1:
		allMsg += decoded
		#print(decoded)

con.close()
allMsg = 'Logged by:\n<http://******/' + today + '.log>\n\n' + allMsg

# メール送信
msg = MIMEText(allMsg.encode('utf-8'), 'plain', 'utf-8')
msg['Subject'] = '[log] ' + today
msg['From'] = '*******'
msg['To'] = '******@dwango.co.jp'
msg['Date'] = formatdate()

smtp = smtplib.SMTP('******')
smtp.sendmail(msg['From'], [msg['To']], msg.as_string())
smtp.close()


スライス記法

# 現在日付をyyMMddの形式で取得
today = str(datetime.date.today()).replace('-', '')[2:]


文字列操作関係を調べてたら[2:]みたいな変な書き方が出てきました。
これはスライスっていう書き方で
たとえばこんなことができます。

# インデックスが1から3の部分文字列を取得
>>>word = 'hogehoge'
print(word[1:3])

# 出力結果
oge


[2:]は(0から数えて)2番目以降の部分文字列取得するという意味です。
ちなみに、文字列じゃなくてリストでも同じことができます。


で、このプログラムを作る上で混乱したことがあったのでメモしておきます。

Python3.xではurllib.urlopen('URL文字列') はエラーになります
2.6から3.0で標準ライブラリのパッケージの統合などが行われたそうです。

import文の違い。

# 2.6
import urllib
import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate


# 3.x
import urllib.request
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate


なぜ、はまったかというとWeb上の参考ページのほとんどが
Python2.6を前提に書かれているからです。
(3.xに関するページはまだかなり少ないようです。)


細かい変更点に関しては以下のドキュメントが参考になります。

What'sNewInPython3.0
http://text.world.coocan.jp/TSNET/?What'sNewInPython3.0