最近學 python 的人比較多,今天講一下 python 的基礎:python 腳本的規範、縮進、編寫功能函數時注意事項等,這些都是自己編程過程中的心得體會。
一、python 腳本的規範:
每個腳本都有自己的規範,以下的規範不是強制的,但是規範一下,可以使你的腳本規範、易懂、方便使用。
#!/usr/bin/env python # -*- coding: utf-8 -*-
這個寫在開頭,定義腳本編碼。現在多數都是 UTF8 格式,所以寫腳本盡量用這個編碼,遇到中文可以做編碼處理,字符串編碼處理主要就是 encode 和 decode
import os,urllib,MySQLdb,time,platform
導入需要的模塊。
main: pass
定義函數
if __name__ == "__main__": main
這個就是說腳本從這裡往下執行,如果是其他的腳本調用這個腳本,這個腳本不至於執行其他的部分
提示:以上是整個腳本中的規範,大家在寫腳本的時候盡量這麼做。
二、python 的縮進
python 的對縮進要求很嚴格,縮進不對,就會報語法錯誤;python 中縮進就是一個 tab 鍵或是 4 個空格,4 個空格比較麻煩,直接一個 tab 鍵簡單,所以沒有特別的需求,縮進一般用 tab 鍵。縮進類似於分層,同一縮進就是相同的層次。見如下實例:
if a==0: print aelse: print b
三、每一個功能對應一個函數
這一點我認為最重要,每一個功能就寫一個函數,這樣你的腳本清晰易懂,腳本其他復用這個功能也方便,腳本也不冗余。不建議不要一個函數里面有好多功能,使函數模塊化。
四、系統命令的引用
引用系統命令的時候,特別是 linux 命令,一定要寫命令的全路徑,比如:
os.popen("/sbin/ifconfig eth0").read
這個你直接
os.popen("ifconfig eth0").read
這樣也是沒有問題的,起碼是你手動執行腳本時,這個是會執行的,但是腳本做 cron 的時候,就不會執行了。所以這個要特別注意。
五、異常處理
try: passexcept Exception,e: print e
其中 e 就是錯誤錯誤信息。try 的異常處理這麼寫就足夠用了,還有其他的方法,不常用。
以下是一個獲取本地 ip 地址,從數據庫查詢 ip 的用途,去連接一個 URL,判斷這個 URL 是否可以用,並寫日誌。主要講了講 python 操作數據庫的常用用法。
#!/usr/bin/env python # -*- coding: utf-8 -*-import os,urllib,MySQLdb,time,platformdef log_w(text): logfile = "/tmp/websocket.log" if os.path.isfile(logfile):if (os.path.getsize(logfile)/1024/1024) > 100: os.remove(logfile) now = time.strftime("%Y-%m-%d %H:%M:%S") tt = str(now) + "t" + str(text) + "n" f = open(logfile,\'a+\') f.write(tt) f.closedef get_idcname(ip): try:conn = MySQLdb.connect(host = \'192.168.8.43\',port=3306,user = \'read_app\',passwd = \'123456\',charset=\'utf8\',connect_timeout=20)cursor = conn.cursor#查詢出的結果是元組形式,元組和列表基本一樣#cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)#查詢結果是字典形式sql = "select host,user from mysql.user where host=\'%s\'" % ip#python中執行sql語句一次只能是一個sql語句,一次只執行一條,如果用分號分開寫多條的話是會報錯的,如果是多條sql語句可以多寫幾個sql和cursor.execute來分開執行cursor.execute(sql)#執行sql語句#cursor.executemany("""insert into dist_sniffer.sniffer_order_day values(%s,%s,%s,%s,%s,%s,%s,%s,%s) """,values)#執行組合插入數據庫的時候可以用這個,每個%s代表一個數據庫字段,values是一個元組或是一個列表alldata = cursor.fetchall#接收sql執行結果,如果是寫操作的,這個就不用了#conn.commit如果是寫操作,需要這個去提交cursor.closeconn.close#關閉數據庫回話return alldata[0][0].encode(\'UTF8\')#如果是寫操作的話就沒有返回值了。 except Exception,e:return 0def get_ip: os = platform.system if os == "Linux":ip = os.popen("/sbin/ifconfig eth0|grep \'inet addr\'").read.strip.split(":")[1].split[0] elif os == "Windows":import wmic=wmi.WMInetwork = c.Win32_NetworkAdapterConfiguration (IPEnabled=1)for interface in network: if interface.DefaultIPGateway:ip = interface.IPAddress[0]return ip#print interface.IPAddress[0],interface.MACAddress,interface.IPSubnet[0],interface.DefaultIPGateway[0],interface.DNSServerSearchOrder[0],interface.DNSServerSearchOrder[1]#獲取出網的ip地址、MAC地址、子網掩碼、默認網關、DNSdef web_status: ip = get_ip idc_name = get_idcname(ip) url = "http://www.text.com/index.php?idc_ip=%s&idc_name=%s" % (ip,idc_name) get = urllib.urlopen(url) if get.getcode == 200:aa = int(get.read.strip)if aa == 1: text = "Webservice return OK"else: text = "Webservice return Error" else:text = "Conect webservice Error" print text log_w(text)if __name__ == "__main__": web_status
一開始就要養成一個好習慣,這樣對以後 python 編程是十分有益的。自己的深切體會。