本文用作记录,在使用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>>stop123同行输出 Print '%s' % a,Print '%s \r' % a标准输入输出 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 divisionimport 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 sysimport timefor i in range(1,61): sys.stdout.write('#'+'->'+"\b\b") sys.stdout.flush() time.sleep(0.5)方案三 from progressbar import *import timeimport osrows, columns = os.popen('stty size', 'r').read().split() #获取控制台size console_width=int(columns)total = 10progress = 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_libprint get_python_lib获取当前python版本 sys.version_infosys.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以后存在可以使用osos.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: #如果目录名称为tag lists.append(paths) #将该路径添加到列表中 else: #如果目录名称不为tag 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 bTrueformat方法拼接字符串与变量 a="{test} abc {test2}".format(test="123",test2="456")>>>>print a 123 abc 456或者:a="{},{}".format(1,2)>>>>>print a1,2去掉小数点后面的数字 a=1.21311b=Int(math.floor(a))字符串倒置 >>> a = "codementor">>> a[::-1]字符串首字母变大写 info = 'ssfef'print info.capitalize()print info.title()返回一个字符串居中,并使用空格填充至长度width的新字符串。 "center string".center(width) #width设置为控制台宽度,可控制输出的字符串居中。列举所有字母 print string.ascii_uppercase 所有大写字母print string. ascii_lowercase 所有小写字母print string.ascii_letters 所有字母(包括大小写)列表(list)列表去重 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()}字典操作(dict)筛选出值重复的key list1=self.dict_ip.items() ddict=defaultdict(list) for k,v in list1: ddict[v].append(k) list2=[(i,ddict) for i in ddict if len(ddict)>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","") #如果不存在a,则返回””c=a if a else 0 #如果存在a,则返回a,不然返回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动态加载一个目录下的所有模块 目录:---test ----a.py ----b.py---c.pyc.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 #执行字符串中的内容函数操作eval/execdef test(content): print contentexec(“test(‘abc')”)输出:abc
说明:exec函数没有返回值 def test(content): return contentprint eval(“test(‘abc')”)输出:abc
说明:eval函数有返回值 装饰器函数输出当前时间装饰器 def current_time(aclass): def wrapper(): print "[Info]NowTimeis:",time.ctime() return aclass() return wrapperitertools迭代器p=product(["a","b","c","d"],repeat=2)----[("a","a"),("b","b")......]reduce函数函数本次执行的结果传递给下一次。 def test(a,b): return a+breduce(test,range(10))结果:从0+1+2......+9enumerate函数输入列表元素以及序列号 n=["a","b","c"]for i,m in enumerate(n): print(i,m)函数超时时间设置@于2017.05.27更新
利用signal设置某个函数执行的超时时间 import timeimport signal def test(i): time.sleep(0.999)#模拟超时的情况 print "%d within time"%(i) return i def fuc_time(time_out): # 此为函数超时控制,替换下面的test函数为可能出现未知错误死锁的函数 def handler(signum, frame): raise AssertionError try: signal.signal(signal.SIGALRM, handler) signal.alarm(time_out)#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@retrydef 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,它才会执行结束,否则会一直重新执行,关于该模块更多的用法请自行搜索。 程序操作@于2017.05.27更新 Ctrl+C退出程序利用signal实现ctrl+c退出程序。 import signalimport sysimport timedef handler(signal_num,frame): print "\nYou Pressed Ctrl-C." sys.exit(signal_num)signal.signal(signal.SIGINT, handler)# 正常情况可以开始你自己的程序了。# 这里为了演示,我们做一个不会卡死机器的循环。while 1: time.sleep(10)# 当你按下Ctrl-C的时候,应该会输出一段话,并退出.程序自重启利用os.execl方法实现程序自重启 import timeimport sysimport osdef restart_program(): python = sys.executable print "info:",os.execl(python, python, * sys.argv) #os.execl方法会代替自身进程,以达到自重启的目的。if __name__ == "__main__": print 'start...' print u"3秒后,程序将结束...".encode("utf8") time.sleep(3) restart_program()
|