本文用作記錄,在使用python過程中遇到的一些技巧,有些代碼是本人所寫,有些則是python內置函數,有些則取之網際網路。在此記錄,只為備份以及遺忘時方便查找。
內容僅限記錄一些常用好用卻又永遠記不住的代碼或者模塊。
控制臺操作控制臺不閃退
os.system('pause')
獲取控制臺大小
rows, columns = os.popen('stty size', 'r').read().split()
輸入輸出控制解決輸入提示中文亂碼問題
raw_input(unicode('請輸入文字','utf-8').encode('gbk'))
格式化輸出
print a.prettify()
接受多行輸入
text=""
while 1:data=raw_input(">>")
if data.strip()=="stop":
break
text+="%s\n" % dataprint text--
>>1
>>2
>>3
>>stop
1
2
3
同行輸出
Print '%s' Print '%s \r'
標準輸入輸出
sys.stdout.write("input") 標準輸入
sys.stdout.flush() 刷新緩衝區
print的功能與sys.stdout.write類似,因為2.x中print默認就是將輸出指定到標準輸出中(sys.stdout)。
顏色控制控制臺顏色控制(適用於windows)
WConio.textcolor(WConio.YELLOW)
print "yellow"
WConio.textcolor(WConio.BLUE)
print "blue"
輸出顏色控制(全平臺)
red = '\033[1;31m'
green = '\033[1;32m'
yellow = '\033[1;33m'
white = '\033[1;37m'
reset = '\033[0m』 print red+"color is red"+resetprint green+"color is green"+reset
方案一
from __future__ import division
import sys,timej = '#'
for i in range(1,61):j += '#'
sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"\r")sys.stdout.flush()time.sleep(0.1)
方案二
import sys
import time
for i in range(1,61):
sys.stdout.write('#'+'->'+"\b\b")
sys.stdout.flush()
time.sleep(0.5)
方案三
from progressbar import *
import time
import osrows, columns = os.popen('stty size', 'r').read().split() console_width=int(columns)total = 10
progress = ProgressBar()
def test():
'''進度條函數,記錄進度'''
for i in progress(range(total)):test2()
def test2():
'''執行函數,輸出結果'''
content="nMask'Blog is http://thief.one"
sys.stdout.write("\r"+content+" "*(console_width-len(content)))time.sleep(1)sys.stdout.flush() test()
更多高級用法可以使用progressbar模塊。
系統作業系統信息獲取python安裝路徑
from distutils.sysconfig import get_python_lib
print get_python_lib
獲取當前python版本
sys.version_info
sys.version
獲取當前時間
c=time.ctime()
ISOTIMEFORMAT=』%Y-%m-%d %X’time.strftime( ISOTIMEFORMAT, time.localtime() )
查看系統環境變量
os.environ["PATH"]
獲取系統磁碟
os.popen("wmic VOLUME GET Name")
獲取當前路徑(包括當前py文件名)
os.path.realpath(__file__)
當前平臺使用的行終止符
os.linesep
獲取終端大小
rows, columns = os.popen('stty size', 'r').read().split()#python3以後存在可以使用os
os.get_termial_size()
return:返回函數的值,並退出函數。
exit():直接退出。
sys.exit(): 引發一個SystemExit異常,若沒有捕獲錯誤,則python程序直接退出;捕獲異常後,可以做一些額外的清理工作。
sys.exit(0):為正常退出,其他(1-127)為不正常,可拋異常事情供捕獲。(一般用於主線程中退出程序)
os._exit(0): 直接退出python程序,其後的代碼也不會執行。(一般用於線程中退出程序)
網絡操作域名解析為ip
ip= socket.getaddrinfo(domain,'http')[0][4][0]
獲取伺服器版本信息
sUrl = 'http://www.163.com'sock = urllib2.urlopen(sUrl)sock.headers.values()
文件操作open函數,使用wb、rb代替w、r
with open("test.txt","wr") as
w:w.write("test")
這種寫法可以兼容python2/3。
輸出一個目錄下所有文件名稱
def search(paths):
if os.path.isdir(paths): files=os.listdir(paths) for i in files:i=os.path.join(paths,i) search(i) elif os.path.isfile(paths): print paths
文件查找
import globprint glob.glob(r"E:/*.txt") 查找文件只用到三個匹配符:」*」, 「?」, 「[]「」*」匹配0個或多個字符;」?」匹配單個字符;」[]「匹配指定範圍內的字符,如:[0-9]匹配數字。
查找指定名稱的文件夾的路徑
def search(paths,file_name,tag,lists):
if os.path.isdir(paths): if file_name==tag: lists.append(paths) else: try:files_list=os.listdir(paths) for file_name in files_list:path_new=os.path.join(paths,file_name) search(path_new,file_name,tag,lists) except: pass
elif os.path.isfile(paths): pass
return lists
判斷數據類型
isinstance("123",(int,long,float,complex)
字符串(string)字符串推導
a="True"
b=a if a=="True" else "False"
>>>print bTrue
format方法拼接字符串與變量
a="{test} abc {test2}".format(test="123",test2="456")
>>>>print a
123 abc 456
或者:a="{},{}".format(1,2)
>>>>>print a
1,2
去掉小數點後面的數字
a=1.21311
b=Int(math.floor(a))
字符串倒置
>>> a = "codementor"
>>> a[::-1]
字符串首字母變大寫
info = 'ssfef'
print info.capitalize()print info.title()
返回一個字符串居中,並使用空格填充至長度width的新字符串。
"center string".center(width)
列舉所有字母
print string.ascii_uppercase 所有大寫字母
print string. ascii_lowercase 所有小寫字母
print string.ascii_letters 所有字母(包括大小寫)
列表去重
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))
判斷列表為空
a=[]
if not a:
列表運算
a=[1,2,3]b=[3,4,5]
set(a)&set(b) 與
set(a)|set(b) 或
set(a)-set(b) 非
單列表元素相加
a = ["Code", "mentor", "Python", "Developer"]
>>> print " ".join(a)Code mentor Python Developer
多列表元素分別相加
list1 = ['a', 'b', 'c', 'd']list2 = ['p', 'q', 'r', 's']
>>> for x, y in zip(list1,list2):
print x, yapbqcrds
將嵌套列錶轉換成單一列表
a = [[1, 2], [3, 4], [5, 6]]
>>> import itertools>>> list(itertools.chain.from_iterable(a))[1, 2, 3, 4, 5, 6]
列表內元素相加
a=[1,2,3](數字)sum(a)
產生a-z的字符串列表
map(chr,range(97,123))
列表複製
a=[1,2,3]b=a當對b進行操作時,會影響a的內容,因為共用一個內存指針,b=a[:] 這樣就是單獨複製一份了。
列表推導if+else配合列表解析
[i if i >5 else -i for i in range(10)]
多層嵌套列表
a=[[1,2],[3,4]]
b=[for j in i for i in a]
print b[1,2,3,4]
生成一個生成器,調用next方法,可以減少內存開支。
a=(i else i+1 for i in b if i==1)
字典推導更換key與value位置
dict={"a":1,"b":2}
b={value:key for key value in dict.items()}
篩選出值重複的key
list1=self.dict_ip.items()ddict=defaultdict(list)
for k,v in list1:ddict[v].append(k)list2=[(i,ddict[i]) for i in ddict if len(ddict[i])>1]dict_ns=dict(list2)
字典排序(py2)
file_dict={"a":1,"b":2,"c":3}
file_dict_new=sorted(file_dict.iteritems(), key=operator.itemgetter(1),reverse=True) ##字典排序,reverse=True由高到低,itemgetter(1)表示按值排序,為0表示按key排序。
字典值判斷
b={"a":1}a=b.get("a","") c=a if a else 0
模塊操作導入模塊時,設置只允許導入的屬性或者方法。
fb.py:---__all__=["a","b"]a="123"
c="2345"
def b():
print 「123」---
from fb import *可以導入__all__內定義的變量,a跟b()可以導入,c不行。如果不定義__all__則所有的都可以導入。
導入上級目錄下的包
sys.path.append("..")
from spider.spider_ import spider_
導入外部目錄下的模塊
需要在目標目錄下創建__init__.py文件,內容隨便。
增加模塊屬性
有時候原始碼中,我們需要寫上自己的名字以及版本介紹信息,可以用__name__的方式定義。a.py:
#! -*- coding:utf-8 -*-
__author__="nMask"
然後當我們導入a這個模塊的時候,可以輸出dir(a)看看
>>> import p
>>> print dir(p)['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__']
>>> print p.__author__
nmask
動態加載一個目錄下的所有模塊
目錄:
c.py導入test下面的所有模塊:
for path in ["test"]:
for i in list(set([os.path.splitext(i)[0] for i in os.listdir("./"+path)])):
if i!="__init__" and i!=".DS_Store": ##排除不必要的文件import_string = "import path+"."+i+"
exec import_string #執行字符串中的內容
def test(content):
print content
exec(「test(『abc')」)
輸出:abc
說明:exec函數沒有返回值
def test(content):
return content
print eval(「test(『abc')」)
輸出:abc
說明:eval函數有返回值
裝飾器函數輸出當前時間裝飾器
def current_time(aclass):
def wrapper():
print "[Info]NowTimeis:",time.ctime()
return aclass()
return wrapper
p=product([,,,],repeat=2)----[(,),(,).]
reduce函數函數本次執行的結果傳遞給下一次。
def test(a,b):
return a+breduce(test,range(10))結果:從0+1+2.+9
輸入列表元素以及序列號
n=["a","b","c"]
for i,m in enumerate(n):
print(i,m)
利用signal設置某個函數執行的超時時間
import time
import signal
def test(i):
time.sleep(0.999)print "%d within time"%(i)
return i
def fuc_time(time_out):
def handler(signum, frame):
raise AssertionError
try:signal.signal(signal.SIGALRM, handler)signal.alarm(time_out)temp = test(1) return temp
except AssertionError:
print "%d timeout"%(i)if __name__ == '__main__':
for i in range(1,10):fuc_time(1)
利用retrying模塊實現函數報錯重試功能
import randomfrom retrying import retry
@retry
def have_a_try():
if random.randint(0, 10) != 5:raise Exception('It's not 5!')print 'It's 5!'
如果我們運行have_a_try函數,那麼直到random.randint返回5,它才會執行結束,否則會一直重新執行,關於該模塊更多的用法請自行搜索。
程序操作Ctrl+C退出程序利用signal實現ctrl+c退出程序。
import signal
import sys
import time
def handler(signal_num,frame):
print "\nYou Pressed Ctrl-C."
sys.exit(signal_num)signal.signal(signal.SIGINT, handler)
while 1:time.sleep(10)
利用os.execl方法實現程序自重啟
import time
import sys
import os
def restart_program():
python = sys.executable
print "info:",os.execl(python, python, * sys.argv)
if __name__ == "__main__":
print 'start...'
print u"3秒後,程序將結束...".encode("utf8")time.sleep(3)restart_program()