最近學(xué) python 的人比較多,今天講一下 python 的基礎(chǔ):python 腳本的規(guī)范、縮進(jìn)、編寫(xiě)功能函數(shù)時(shí)注意事項(xiàng)等,這些都是自己編程過(guò)程中的心得體會(huì)。
每個(gè)腳本都有自己的規(guī)范,以下的規(guī)范不是強(qiáng)制的,但是規(guī)范一下,可以使你的腳本規(guī)范、易懂、方便使用。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
這個(gè)寫(xiě)在開(kāi)頭,定義腳本編碼?,F(xiàn)在多數(shù)都是 UTF8 格式,所以寫(xiě)腳本盡量用這個(gè)編碼,遇到中文可以做編碼處理,字符串編碼處理主要就是 encode 和 decode
import os,urllib,MySQLdb,time,platform
導(dǎo)入需要的模塊。
main():
pass
定義函數(shù)
if __name__ == "__main__":
main()
這個(gè)就是說(shuō)腳本從這里往下執(zhí)行,如果是其他的腳本調(diào)用這個(gè)腳本,這個(gè)腳本不至于執(zhí)行其他的部分
提示:以上是整個(gè)腳本中的規(guī)范,大家在寫(xiě)腳本的時(shí)候盡量這么做。
python 的對(duì)縮進(jìn)要求很嚴(yán)格,縮進(jìn)不對(duì),就會(huì)報(bào)語(yǔ)法錯(cuò)誤;python 中縮進(jìn)就是一個(gè) tab 鍵或是 4 個(gè)空格,4 個(gè)空格比較麻煩,直接一個(gè) tab 鍵簡(jiǎn)單,所以沒(méi)有特別的需求,縮進(jìn)一般用 tab 鍵??s進(jìn)類似于分層,同一縮進(jìn)就是相同的層次。見(jiàn)如下實(shí)例:
if a==0:
print a
else:
print b
這一點(diǎn)我認(rèn)為最重要,每一個(gè)功能就寫(xiě)一個(gè)函數(shù),這樣你的腳本清晰易懂,腳本其他復(fù)用這個(gè)功能也方便,腳本也不冗余。不建議不要一個(gè)函數(shù)里面有好多功能,使函數(shù)模塊化。
引用系統(tǒng)命令的時(shí)候,特別是 linux 命令,一定要寫(xiě)命令的全路徑,比如:
os.popen("/sbin/ifconfig eth0").read()
這個(gè)你直接
os.popen("ifconfig eth0").read()
這樣也是沒(méi)有問(wèn)題的,起碼是你手動(dòng)執(zhí)行腳本時(shí),這個(gè)是會(huì)執(zhí)行的,但是腳本做 cron 的時(shí)候,就不會(huì)執(zhí)行了。所以這個(gè)要特別注意。
try:
pass
except Exception,e:
print e
其中 e 就是錯(cuò)誤錯(cuò)誤信息。try 的異常處理這么寫(xiě)就足夠用了,還有其他的方法,不常用。
以下是一個(gè)獲取本地 ip 地址,從數(shù)據(jù)庫(kù)查詢 ip 的用途,去連接一個(gè) URL,判斷這個(gè) URL 是否可以用,并寫(xiě)日志。主要講了講 python 操作數(shù)據(jù)庫(kù)的常用用法。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,urllib,MySQLdb,time,platform
def 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.close()
def 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()#查詢出的結(jié)果是元組形式,元組和列表基本一樣
#cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)#查詢結(jié)果是字典形式
sql = "select host,user from mysql.user where host='%s'" % ip#python中執(zhí)行sql語(yǔ)句一次只能是一個(gè)sql語(yǔ)句,一次只執(zhí)行一條,如果用分號(hào)分開(kāi)寫(xiě)多條的話是會(huì)報(bào)錯(cuò)的,如果是多條sql語(yǔ)句可以多寫(xiě)幾個(gè)sql和cursor.execute()來(lái)分開(kāi)執(zhí)行
cursor.execute(sql)#執(zhí)行sql語(yǔ)句
#cursor.executemany("""insert into dist_sniffer.sniffer_order_day values(%s,%s,%s,%s,%s,%s,%s,%s,%s) """,values)#執(zhí)行組合插入數(shù)據(jù)庫(kù)的時(shí)候可以用這個(gè),每個(gè)%s代表一個(gè)數(shù)據(jù)庫(kù)字段,values是一個(gè)元組或是一個(gè)列表
alldata = cursor.fetchall()#接收sql執(zhí)行結(jié)果,如果是寫(xiě)操作的,這個(gè)就不用了
#conn.commit()如果是寫(xiě)操作,需要這個(gè)去提交
cursor.close()
conn.close()#關(guān)閉數(shù)據(jù)庫(kù)回話
return alldata[0][0].encode('UTF8')#如果是寫(xiě)操作的話就沒(méi)有返回值了。
except Exception,e:
return 0
def 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 wmi
c=wmi.WMI()
network = 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]
#獲取出網(wǎng)的ip地址、MAC地址、子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)、DNS
def 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()
一開(kāi)始就要養(yǎng)成一個(gè)好習(xí)慣,這樣對(duì)以后 python 編程是十分有益的。自己的深切體會(huì)。