スライス記法、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