smtp

Yahoo
#!/usr/bin/env python3

#! /usr/local/bin/python


SMTPserver = 'smtp.att.yahoo.com'
sender =     'me@my_email_domain.net'
destination = ['recipient@her_email_domain.com']

USERNAME = "USER_NAME_FOR_INTERNET_SERVICE_PROVIDER"
PASSWORD = "PASSWORD_INTERNET_SERVICE_PROVIDER"

# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'


content="""\
Test message
"""

subject="Sent from Python"

import sys
import os
import re

from smtplib import SMTP_SSL as SMTP       # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP                  # use this for standard SMTP protocol   (port 25, no encryption)
from email.MIMEText import MIMEText

try:
    msg = MIMEText(content, text_subtype)
    msg['Subject']=       subject
    msg['From']   = sender # some SMTP servers will do this automatically, not all

    conn = SMTP(SMTPserver)
    conn.set_debuglevel(False)
    conn.login(USERNAME, PASSWORD)
    try:
        conn.sendmail(sender, destination, msg.as_string())
    finally:
        conn.close()

except Exception, exc:
    sys.exit( "mail failed; %s" % str(exc) ) # give a error message
Gmail
自己做的exmaple 如下
#!/usr/bin/env python3
from email.mime.text import MIMEText
import smtplib

###
   #tls加密方式,通信過程加密,郵件數據安全,使用正常的smtp端口
    #smtp = smtplib.SMTP(smtpHost,smtpPort)
    #smtp.ehlo()
    #smtp.starttls()
    #smtp.ehlo()
    #smtp.login(username,password)

    #純粹的ssl加密方式,通信過程加密,郵件數據安全
    #smtp = smtplib.SMTP_SSL(smtpHost,sslPort)
    #smtp.ehlo()
    #smtp.login(username,password)
###
class Gmail (object):
    def __init__ (self, account, password):
        self.account = "%s@gmail.com" % account
        self.password = password

    def send (self, to_list, title, content):
        server = smtplib.SMTP('smtp.gmail.com',587)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(self.account, self.password)

        msg = MIMEText(content)
        msg['Content-Type'] = 'text/plain; charset="utf-8"'
        msg['Subject'] = title
        msg['From'] = self.account
        msg['To'] = to_list

        try:
            server.sendmail(self.account, to_list, msg.as_string())
        except (Exception):
            print (Exception)
        else:
            print ("Send Success")
        server.close()

if __name__ == '__main__':
    gmail=Gmail(useraddress,password)
    gmail.send("sendaddess,", "hello123", "test")

以下為參考範例

smtp 請改為 smtp.gmail.com' port:587
文件形式的郵件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'

msg = MIMEText('你好','text','utf-8')#中文需參數『utf-8』,單字節字符不需要
msg['Subject'] = Header(subject, 'utf-8')

smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

帶附件的郵件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'

msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'test message'

#構造附件
att = MIMEText(open('h:\\python\\1.jpg', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="1.jpg"'
msgRoot.attach(att)
        
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()

群組郵件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.text import MIMEText

sender = '***'
receiver = ['***','****',……]
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'

msg = MIMEText('你好','text','utf-8')

msg['Subject'] = subject

smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()


with ssl
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'

msg = MIMEText('你好','text','utf-8')#中文需參數『utf-8』,單字節字符不需要
msg['Subject'] = Header(subject, 'utf-8')

smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.set_debuglevel(1)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

keyword of python

List of keywords

The following is a list of keywords for the Python programming language.
and       del       from      not       while
as        elif      global    or        with
assert    else      if        pass      yield
break     except    import    print
class     exec      in        raise
continue  finally   is        return 
def       for       lambda    try

小練習 - 密碼產生器

import random
#n = number of password, long = long of password
def made_a_password(n,long):
    symbol='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    password = {}
    for i in range(n):
        lst = list()
        #init the list, make it keep empty
        for c in range(long):
            lst.append(symbol[random.randint(0, len(symbol)-1)])
        #join the list to a string,and add to the dict
        password[i] = ''.join(lst)
    return password

def main():
    print(made_a_password(2, 15))

if __name__ == '__main__':
    main()

try and except and finally 示意圖

try and expect and finally 示意圖





#example try except
def read_data(filename):
    data=[]
    fh=None
    try:
        fh=open(filename,encoding="utf-8")
        #fh=codecs.open(filename, 'r', "utf-8")
        for line in fh:
            if line.strip():
                #strip-delete the space
                #if it still have character,then is true
                #otherwise is false
                data.append(line)
    except(IOError, OSError) as err:
        print(err)
        return []
    finally:
        if fh is not None:
            fh.close()
    return data

for and while with else

#search target in list , while done the loop, and not happen break, it will do else
#in this function, while done the loop,mean it can't found the target,so it set index to -1
#and return the index
#else is a choice,not necessary
def list_find_while(lst, target):
    index = 0
    while(index < len(lst)):
        if(lst[index] == target):
            break
        index += 1
    else:
        index = -1
    return index
#search target in list , for done the loop, and not happen break, it will do else statement
#in this function, for done the loop,mean it can't found the target,so it set index to -1
#and return the index
#else is a choice,not necessary
#in for loop enumerate will return a index and the value
'''
enumerate(list, start=0) it can set the index where start
example for enumerate
for index, x in enumerate(['a','b','c','d']):
    print(index, x)
will output
0 'a'
1 'b'
2 'c'
3 'd'
'''
def list_find_for(lst, target):
    for index, x in enumerate(lst) :
        if(lst[index] == target):
            break
    else:
        index = -1
    return index

testlst = [1,2,3,4,5]
print(list_find_while(testlst, 3), list_find_for(testlst, 2))

matplotlib

matplotlib是繪製二維圖形的Python模塊,它用Python語言實現了MATLAB畫圖函數的易用性,同時又有非常強大的可定製性。

download : matplotlib for python32

在python 中使用
import pylab

python 對象的共用?

#number is not share
num1=num2=0
num2+=1
print('num1:', num1, 'num2:', num2)
#share same list
L1=L2=[]
L1.append(1)
print('L1:', L1, 'L2:', L2)

#indepent list
L3=[]
L4=[]
L3.append(1)
print('L3:', L3, 'L4:', L4)

字串印出 應用


#string index and scale str='hello python' print(str[0])#string index print(str[1:3])#string scale print(str[1::2])#third is step(default step is one) #use string scale to create new string print(str[0:2]+'s') #replace string str=str.replace('l', 'o')#use string replace l => o print(str) #find string begin=str.find('python')#it will return where the string begin place #if it can't find your word , it will return -1 print(str[begin:]) print('begin '+str[begin:]) #you can turn the string to list,to change to word newstr=list(str) print(newstr) newstr[0]='g'#change index 0 newstr=''.join(newstr)#all element join in one string #split the string #ex1 word='how are you?' print(word) word_split=word.split(' ')#use your keyword to split #ex2 word2='fine,thanks' word2_split=word2.split(',') print(word2_split) print(word_split) print(newstr)

python 格式化印出

#everything is object
#單引號雙引號是一樣的 in python
print('hello\t!')
print("hello\t!")
print('''hello
this
is
muti
line
print
''')

print(r'hello\t')#免轉義

print('%5d--%02.6f--%+2.6e'%(60, 6.6666, 6.66))
#與c相同的格式化輸出 0為補零 +為正負號 -為靠左

print('%d'%(123))#格式化輸出
print('%(n)d'%{'n':123})#使用字典的格式化輸出

Python的字串

Python的字串

文字是人類特有的溝通方式之一,對於電腦而言,程式語言本身也是由文字組成的語言,因此從這裡就可以看出文字的處理對於電腦而言是非常重要的,其實 我們和電腦溝通幾乎都是用文字,下指令是文字、程式語言是文字、顯示出來的訊息也是文字,因此程式語言通常都會有處理字的能力,那什麼是字串呢?就是電腦 裡的一段文字,都可以叫字串,如同其它語言一樣,Python一樣有屬於它的字串,而且Python的字串處理非常強大且簡單,現在就讓我們來介紹 Python的字串。

Python的字串可以由"和'或是"""包起來,基本上效果是一樣的
'字串' "字串" """多行字串""" 像這樣把字包起來就是一個字串,多行字串我們在註解裡介紹過了,其實單一行存在的字串可以拿來當註解,更精確的來說,應該是程式的文件,有關於這一點,請看Python的內件文件一文,由於那不是本篇的重點,所以在這裡只提醒帶過而已。

還有一點值得注意的是,字串是屬於"不可改變"的物件,也就是說,所有對於字串的修改,其實都是創造出一個新的字串,而不是改變字串物件本身,關於這點在以後會看到其它"可改變的"和"不可改變"的物件。

以下示範一下字串的用法:
# 設定名字為Victor Lin這樣的字串 name = "Victor Lin" print name # 有兩種'和"的好處就是可以交替使用 # 就不會有衝到的問題,在這裡用""括起來' msg = "Victor's Programming Tutorial" print msg # 同樣的也可以這樣使用 msg = 'What is "Python"?' print msg # 多行的文字 # 同樣裡面也可以使用'和" multiLine = """Hello! Baby! second line! third line! Welcome to Victor's Tutorial What is "python" """ print multiLine

跳脫字元

那你可能會問,如果我非得使用'和"或是"""在字串裡不可該怎麼辦?答案很簡單,使用跳脫字元,如果你有學過其它程式語言就知道,Python當 然也有跳脫字元,所謂的跳脫字元就是\再加上一些特定符號,來代表特殊符號,打不出來或會被誤解的符號,以下列出表格表示Python的各種跳脫字元:
跳脫字元代表字元
\\ 表示反斜線\
\' 表示單引號'
\" 表示雙引號"
\a ASCII裡的Bell
\b ASCII裡的Backspace
\f ASCII裡的Formfeed
\n ASCII裡的Linefeed,也就是一般認知裡的換行
\N{name} 在Unicode裡名為name代表的字元
\r ASCII裡的Carriage Return
\t ASCII裡的Horizontal Tab
\uxxxx Unicode裡16位元的xxxx在16進制裡代表的字元
\Uxxxxxxxx Unicode裡32位元的xxxxxxxx在16進制裡代表的字元
\v ASCII裡的Vertical Tab
\ooo ooo在8進制代表的字元
\xhh hh在16進指代表的字元
\0 代表ASCII裡的 NULL,但是並不中斷字串
有一點值得注意的是,如果你有學過其它語言,你可能知道很多語言都拿'\0'來當做字串結束的符號,但Python字串裡的'\0'不會中斷字串,因為Python的字串並不以'\0'做為字串的結束記號,因此字串在Python也可以拿來存放Binary的資料,以下就讓我們示範如何使用跳脫字元。
# 使用\\跳脫字元 print "c:\\windows\\system32" # 使用\n跳脫字元 print "First line\nSecond line" # 我們在這裡跳脫了"""的第一個",因此沒問題 print """You can write string in \"""string\""" format."""

Unicode

我們在這裡不打算從頭到尾介紹Unicode,有興趣請上Google或維基百科搜尋,而Unicode簡單的來說,就是可以編任何語言的一種文字 的編碼,相較於更早之前的ASCII或Big5等只能編特定語言的編碼來得方便多,不用每個地方的程式都要特別寫,統一起來就大家都用一樣的編 碼,Python一個優勢就是它天生就支援Unicode,所以比起其它語言,這樣的先天優勢使用起來就非常方便,那我們現在就直接介紹Unicode的 使用方式,只要在字串的前面加一個前綴字u就可以了,而這個U是不分大小寫的
u'中文字' U"和偉大的許功蓋先生說再見~" u"""多行也一樣"" u的大小寫並不會有任何影響,在寫範例示範之前,有一點需要注意的就是,Python程式的檔案編碼請設為utf-8,如果你搞錯弄成ASCII 等,很可能就會造成無法執行,Python直譯器在讀時遇到未預期的字元通常就會出錯,Python有提供一種方法可以讓直譯器知道這個檔案是用什麼樣的 編碼,就是
# -*- coding: 編碼名稱 -*- 這樣放在第一行的註解,而通常我們使用的都是utf-8比較多,所以也就是
# -*- coding: utf-8 -*- 而使用Python官方的IDLE有個好處就是,在存檔時它會幫你抓第一行看是什麼編碼,在存檔時就會幫你存成該種編碼,因此你只要加了這行執行起來應該就沒問題,如果你是使用記事本等編輯py檔,那就必需把該檔案設為正確的編碼。

以下示範unicode的使用方式:
# -*- coding: utf-8 -*- # U的大小寫並不造成影響 print U'中文字' # 終於不用再和許功蓋先生拚命了 print u"和偉大的許功蓋先生說再見~" print u"""多行也一樣""" # 用跳脫字元來表示也可以 print u'\u7528\u8df3\u812b\u5b57\u5143\u4f86\u8868\u793a\u4e5f\u53ef\u4ee5' # 日文也可以,不過在DOS下可能印不出來 print u'涼宮ハルヒの憂鬱'

字串的運算

字串也可以運算,你或許會覺得很奇怪,為什麼字串也需要運算,原因很簡單,當你想要把不同的字串合起來時,或是一個字串重覆個幾次,就需要字串的運算,而字串的運算有幾種,並不是像數字運算那樣每樣都有,而我們在這裡並沒有介紹所有的字串運算,先介紹最常用的幾種:
字串運算說明
ls + rs 左右字串串接在一起變成"lsrs"的字串
n*s 字串乘上一個數字,或是數字乘上一個字串,表示重覆該字串n次
x in  s 如果x出現在字串s中為真
x not in s 如果x不出現在字串s中為真
len(s) len函數回傳s字串的長度
接下來示範字串運算的用法:
# -*- coding: utf-8 -*- firstName = "Victor" familyName = "Lin" # 在這裡我們用 + 將字串接起來 print "My name is " + firstName + " " + familyName # 在這裡我們用 * 將同一字串重覆n次 print u"一二三" * 3 # 這裡我們用in來判斷字串裡是否有某段文字 # 因為成立,所以回傳True print u'中文' in u'中文字藏在中文字裡' # 這裡我們用not in來判斷字串裡是否沒有某段文字 # 因為不成立,所以回傳False print u'中文' not in u'中文字藏在中文字裡' # 我們用len函數計算"王小名"有幾個字 print len(u'王小明') 以上運算的對象都有限定,例如你不能把字串和數字做相加
'my age : ' + 3 像這樣是錯誤的,那應該怎麼辦呢? 我們下面介紹如何將其它物件轉為字串。

將物件轉換成字串

如我們上面所說的,你不能將字串和非字串做相加,但是卻又非這麼做不可,那該怎麼辦呢? 方法很簡單,就是先將該物件轉成字串,然後兩邊都是字串就可以相加了,以下是轉成字串的函數:

Col 01Col 11
str(o) 回傳o物件轉換成易讀的字串
unicode(o) 回傳o此物件轉換成易讀的unicode字串
repr(o) 回傳o此物件轉換成以跳脫字元表達的字串
str() 通常或是unicode()通常就是拿來將物件轉換成為字串用的,那你可能會問和repr()有什麼差別,差別在於,str()和unicode()轉換 出來的字串是易讀的類形,而repr()轉換出來會把換行、unicode等字都換成跳脫字元表示的形式,且是以Python的字串方式表示,如果你正在 寫程式的話,你可能會想把一個字串用repr()的形式轉換印出來看看,因為這樣可以確定字串的實際內容到底是什麼,或是字串的跳脫字元表示出來的形式是 怎樣,這個字串是不是unicode,以下讓我們示範這幾種方式: # -*- coding: utf-8 -*- myAge = 3 # 將myAge轉成字串,和前面的字結合印出"Hello, my age is 3" print 'Hello, my age is ' + str(myAge) # unicode的字串可以和非unicode的字串接合,但結果還是unicode print u'你好,我今年' + str(myAge) + u'歲' # 這會以跳脫字元的形式印出來,所以會是'c:\\windows\\system32' print repr('c:\\windows\\system32') # 一樣使用跳脫字元的形式印出來,結果會是'First line\nSecond line' print repr('First line\nSecond line') # 下面這行會印出u'\u4e2d\u6587\u5b57' # 也就是用Python字串表示的方式 # 連前面的u一樣也會印出來 # 我們可以知道這是一個unicode字串 print repr(u'中文字') # 我們也可以將一個一般字串 # 用unicode轉成unicode字串 # 再用repr轉換,你會發現結果是u'hello' # 原本的'hello'變成了unicode的u'hello'字串了 print repr(unicode('hello') Python並沒有限定可以轉換成字串的物件,不只有數字可以轉換,而是每個物件都可以有一個轉換成字串的函數,也就是由該物件來決定自己轉換成字串後是什麼樣子,下面例子示範轉換其它種類的物件: # 引入sys這個module import sys # 將sys此module轉換成字串印出來 # 結果會是<module 'sys'="sys" (built-in)="(built-in)" /> # 這也是module物件自己定的字串形式 print str(sys) # 當然如我們所說的 # 只要是物件都可以轉成字串 # 因為str、unicode、repr都是函數物件 # 我們轉換試試 print str(str) print str(unicode) print str(repr

lottery

#大樂透機率 第一個號碼有49個可選 第二個號碼有48個可選
#大樂透有六個號碼,因此機率為49*48*47*46*45*44
#這邊使用遞歸來算機率
def chance(num, end = 1):#尾數預設為1 若有指定 則為指定值
    if(num == end):
        return end
    else:
        return num * chance(num-1, end)
nstart = 49#第一個號碼可選擇之機率
nend = 44#最後一個號碼可選擇之機率
r = 6#可選擇號碼數目
opp = chance(nstart, nend) / chance(r)
print(format(opp, ','))#格式化印出 千位
print(49*48*47*46*45*44/(6*5*4*3*2*1))
print('if you buy all lottery, you should pay(NT50/per):',format(opp*50, ','))

python 正規表達式

1. 對正規表示式來說,任意字元是以點 (.) 表示。
e.g.
a...e 表示 a 與 e 之間有任意三個字元
ae←比對失敗
a12e←比對失敗,因為不足三個字元
abcde←比對成功

2. 中括號中表示指定特定的字元,若其中一個符合則符合
e.g.
a[abc]e
比對成功的例子: aae, abe, ace
比對失敗的例子: aze

3. 小寫的檢查: a-z,大寫的檢查: A-Z,數字的檢查: 0-9
e.g.
a[0-9a-zA-Z]e
在 a 與 e 間插入多個英數字或插入一個以上的特殊符號外,其他都符合規則

4. 在中括號之中的點 (.) ,僅代表一個點。
e.g.
a[.]e
只有 a.e 符合

5. 符號 ^ 在第一個字元出現時有 not 的意思
e.g.
a[^0-9a-zA-Z]e 表示英數字以外的符號符合此項比對

6. 符號 ^ 在第一個字元以外的地方出現,代表 ^ 本身這個字
e.g.
a[0-9^a-zA-Z]e 表示 a 和 e 間出現一個 ^ 或一個英數字均符合

7. 修飾詞:
星號 (*) 可用來代表零或多個
e.g.
a.*z 若字詞頭為 a 尾為 z 則符合
ab*z 若字詞頭為 a 尾為 z ,且中間出現一個以上的 b 則符合
ab.*z 字詞頭為 ab 尾為 z 則符合

問號 (?) 代表零個或一個
w.?e
符合的範例:we、wie
不符合的範例:willie

加號 (+) 代表一個或多個
e.g.
a.+z 在 a 和 z 之間出現一個或以上的字元即符合

若希望在 a 與 z 之間有一個以上非英文大寫的任意字元,
寫法為: a[^A-Z]+z

8. 大括號用來精確比對前一個字
ab{5}z ←僅 abbbbbz 符合
ab{1,5}z ←表示 b 出現最少一次、最多五次
a[A-Z]{1,5}z ←中間可以有一到五個大寫英文字

9. 意義相同的正規表示式:
b{1,} = b+
b{0,} = b*

10. 逸出字元前要加上反斜線
a\.b
a\[b
a\\b

11. 群組(grouping): 用小括號包起來
a(abc)*z ←表示 a 開頭、z 結尾,中間出現任意次數的 "abc"
另外也有記憶小括號的功能
e.g.
import re
m = re.search('it is (fine (today))', 'it is fine today')
m.group(0)
m.group(1)
m.group(2)
#以上程式會依續印出完整字串、左起第一組小括號、第二組小括號

12. 較短的表示方式:
http://www.amk.ca/python/howto/regex/
\w = [a-zA-Z0-9_]
\s = [\t\n \r\f\v]
\d = [0-9]      ←所以 IP 比對可以改寫成 \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
            還可以再縮寫成 \d{1,3}(\.\d{1,3}){3}

大寫則有反義的用途,
例如 \D 是非數字,\W 代表非英數字、\s 代表非空白字元

13. 字和空白之間的交會點是 \b
因此 "Will and Willie are good friends."
可以利用 Will\b 找出 Will (以免同時也比對到 Willie)

14. 正規表示式預設有「貪多」的特性
import re
reg = re.search("t.*d", "today is fine")
reg.group()

這樣的搜尋會一路找到結尾、再找回來、才取出 tod,
會造成效能上的耗費,因此有不貪多演算法,
\.*? ←代表抓取任意字元、任意次數、不貪多
\.+? ←代表抓取任意字元、一次以上、不貪多

不貪多演算法的說明
http://www.gais.com.tw/article.php?u=DeeR&i=20080225

15. 把沒有明顯分隔符號的字串切割重組
e.g.
import re
text = "willie123good456"
"".join(re.split(r"\d+", text))
16. 使用其他人寫好的套件剖析 XML 與 HTML

HTML:
Beautiful Soup
http://www.crummy.com/software/BeautifulSoup/

Parsing HTML 的說明
http://www.crummy.com/software/BeautifulSoup/documentation.html#Parsing%20HTML

XML:
ElementTree
http://effbot.org/zone/element-index.htm
Parsing XML 的說明
http://docs.python.org/lib/module-xml.etree.ElementTree.html



【實作練習: 剖析 log 中異常的 IP】
#假設 IP 為 200 開頭的是異常 IP

#!/usr/bin/python
import re
f = open('/tmp/auth.log')
for i in f:
regex = re.search(r'200\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', i)
if regex:
print regex.group()
f.close()

#re.search 表示比對正規表示式與輸入結果
#第一個參數是正規表示式,第二個是輸入內容
#regex.group() 預設參數是 0

tips:
小括號包起來的東西在 python 裡會被記憶,
因此若只想取 ip 最後一段,可改寫如下:
import re
f = open('/tmp/auth.log')
for i in f:
regex = re.search(r'200\.[0-9]{1,3}\.[0-9]{1,3}\.([0-9]{1,3})', i)
#加上小括號
if regex:
print regex.group(1)
#加上小括號所出現的 index (從 1 開始算)
f.close()


【實作練習:分析 log 檔中的非法使用者想入侵的帳號】
#!/usr/bin/python

import re
f = open('/tmp/auth.log')
for i in f:
regex = re.search(r'Invalid user ([^ ]+) from ([^ ]+)', i)
if regex:
print regex.group(1) + " => " + regex.group(2),
f.close()


【實作練習:分析 log 檔中的非法使用者想入侵的帳號 (改善執行效能)】
#!/usr/bin/python

import re
f = open('/tmp/auth.log')
rec = re.compile(r'Invalid user ([^ ]+) from ([^ ]+)')
for i in f:
regex = rec.search(i)
if regex:
print regex.group(1) + " => " + regex.group(2),
f.close()


【實作練習:分析 log 檔中的非法使用者想入侵的帳號 (縮短正規表示式)】

#!/usr/bin/python

import re
f = open('/tmp/auth.log')
rec = re.compile(r'Invalid user (\w+) from ([^ ]+)')
for i in f:
regex = rec.search(i)
if regex:
print regex.group(1) + " => " + regex.group(2),
f.close()


【實作練習:取出 HTML 的部分內容】
from BeautifulSoup import BeautifulSoup
f = open('test.htm')
html = f.read()
f.close()
soup = BeautifulSoup(html)
soup.html.body.span.string         #取出span標籤內夾記的內容
soup.html.body.a.string          #預設會取出第一個找到的 a 標籤夾記的內容
soup.html.body('div')[1].a.string     #取得第二組 div 內的 a 標籤
soup.html.body.div.a['href'] #抓出 a 標籤中的屬性 href


【實作練習:取出 XML 的部分內容】(for python 2.5)
from xml.etree.ElementTree import XML
myxml = open('test.xml').read()
seek = XML(myxml)
seek.getchildren() #確認 seek 可找到哪些子節點
seek.find('staff').find('name').text #取出子節點 staff 中的 name 裡頭的內容
for i in seek.findall('staff'): #找出所有的 staff
print i.find('name').text #取出 staff 中的 name 內容

send msg to twitter form python(api)

step1.
Tweepy is an awesome Twitter library for Python. Much of this post is based on
information I found in the documentation for Tweepy.
Download Tweepy from GitHub and install it on your system.

Step 2.
Register a new client app with Twitter
Navigate to http://twitter.com/oauth_clients and click on Register a new application.
You might have to log in to the Twitter site first, if you're not already.

Step 3.
Connect the app to your Twitter account
Next, the app needs to be authorized to connect to your account so it can send tweets under your name.
We'll create a one-off utility script to do this. Save the following Python code as a script on your local system.
#!/usr/bin/env python
import tweepy

CONSUMER_KEY = 'paste your Consumer Key here'
CONSUMER_SECRET = 'paste your Consumer Secret here'

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth_url = auth.get_authorization_url()
print ('Please authorize: ' + auth_url)
verifier = raw_input('PIN: ').strip()
auth.get_access_token(verifier)
print ("ACCESS_KEY = '%s'" % auth.access_token.key)
print ("ACCESS_SECRET = '%s'" % auth.access_token.secret)
app key you can sign up inhttps://dev.twitter.com/
Step 4.
You should see a prompt like this:
Please authorize:URL
PIN:
go to the url,and you will see the pin.

Step 5.
Send a test tweet from python
tweepy.api
import tweepy
def send_to_twitter(msg):
    #以下為twitter api 所獲得的KEY 
    CONSUMER_KEY = 'paste your Consumer Key here'
    CONSUMER_SECRET = 'paste your Consumer Secret here'
    ACCESS_KEY = 'paste your ACCESS_KEY here'
    ACCESS_SECRET = 'paste your ACCESS_SECRET here'

    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
    api = tweepy.API(auth)
    #api.update_status(msg)#更新狀態
    api.direct_messages(msg)#發出推文
send_to_twitter("python say hello")

python3 install tweepy

I just compiled instruction on using tweepy with python 3 on windows machine:

1. I assume you have already installed python 3.1 on your windows machine and its located in C:\Python31. If not: please download and install it.

2. As with Linux example above download Tweepy for Python 3

3. To extract tar.gz file on windows machine download 7zip from 7-zip.org and install it. 

4. Download distribute_setup.py and double click on it to install.

5. Create C:\tweepy directory

6. Open 7-zip GUI and navigate to the location of downloaded tweepy-1.4-py3.tar.gz . Click on it to open, then click on the .tar file inside it to get access to content. Extract contents of the .tar file to C:\tweepy

7. To properly set python variable on windows machine go to: My Computer(right click) -> Properties -> Advanced -> Environment Variables -> System Variables. 
If you have PATH variable there, click Edit and add following to the line: ;C:\Python31 (note the semicolon in front of C)
If you don't have PATH variable there, click New, Variable Name: PATH, Variable Value: C:\Python31(no semicolon this time) OK your way out of variables.

8. Open your command prompt: Start -> Run... -> type "cmd" (do not include parentheses, they are only to refer to command"

9. Navigate to C:\tweepy where we previously extracted tweepy content by typing "cd C:\tweepy"

10. Install tweepy for Python 3 on windows by issuing "python setup.py install"

11. Now you can use tweepy with Python 3 on your Windows machine. I just tested it and it works.

watch

#coding: utf-8
'''
本程式可以在 Python2 與 Python3 環境執行
'''
import visual, math
import time
time=time.strftime('%I-%M-%S',time.localtime(time.time()))
time=time.split('-')
print(time)

visual.scene.autoscale = True
hr,min,sec=float(time[0]),float(time[1]),float(time[2])
i=0
pi=3.14159
#box = visual.box( pos=[0,0,0], width=1, length=10, height=0.5 )
#arrow=visual.arrow(pos=(0,0,1), axis=(0,1,0), shaftwidth=1)
sec=sec*6*pi/180.
secarrow=visual.arrow(pos=(0,0,0),axis=(math.sin(sec),math.cos(sec),0),color=visual.color.red,shaftwidth=1)
min=(min+sec/60.)*6*pi/180.
minarrow=visual.arrow(pos=(0,0,0),axis=(math.sin(min),math.cos(min),0),color=visual.color.blue,shaftwidth=1)
hr=(hr+(min+sec)/3600.)*30*pi/180.
hrarrow=visual.arrow(pos=(0,0,0),axis=(math.sin(hr),math.cos(hr),0),color=visual.color.yellow,shaftwidth=1)
ring=visual.ring(pos=(0,0,0), axis=(0,0,1), radius=1.2, thickness=0.1,color=(0,1,1))
visual.label(pos=(1,1,0), text='This is a watch')
while(1):
    secarrow.axis=(math.sin(sec+i*6*pi/180.),math.cos(sec+i*6*pi/180.),0)
    minarrow.axis=(math.sin(min+(i/60.)*6.*pi/180.),math.cos(min+(i/60.)*6.*pi/180.),0)
    hrarrow.axis=(math.sin(hr+(i/3600.)*30.*pi/180.),math.cos(hr+(i/3600.)*30.*pi/180.),0)
    i=i+1
    visual.rate(1)