python奇技淫巧(转载)

转载自:http://bigwayseo.com/2031

本文用作记录,在使用python过程中遇到的一些奇技淫巧,有些代码是本人所写,有些则是python内置函数,有些则取之互联网。在此记录,只为备份以及遗忘时方便查找。
  本文将会持续更新,内容仅限记录一些常用好用却又永远记不住的代码或者模块。

控制台操作
控制台不闪退

1
os.system('pause')

获取控制台大小

1
rows, columns = os.popen('stty size''r').read().split()

输入输出控制
解决输入提示中文乱码问题

1
raw_input(unicode('请输入文字','utf-8').encode('gbk'))

格式化输出

1
print a.prettify()

接受多行输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
text=""
while 1:
    data=raw_input(">>")
    if data.strip()=="stop":
        break
    text+="%s\n" % data
print text
---------------------------
>>1
>>2
>>3
>>stop
 
同行输出
 
Print '%s' % a,
Print '%s \r' % a

标准输入输出

1
2
sys.stdout.write("input") 标准输入
sys.stdout.flush() 刷新缓冲区

print的功能与sys.stdout.write类似,因为2.x中print默认就是将输出指定到标准输出中(sys.stdout)。

颜色控制
控制台颜色控制(适用于windows)

1
2
3
4
WConio.textcolor(WConio.YELLOW)
print "yellow"
WConio.textcolor(WConio.BLUE)
print "blue"

输出颜色控制(全平台)

1
2
3
4
5
6
7
red = '\033[1;31m'
green = '\033[1;32m'
yellow = '\033[1;33m'
white = '\033[1;37m'
reset = '\033[0m
print red+"color is red"+reset
print green+"color is green"+reset

进度条控制
方案一

1
2
3
4
5
6
7
8
from __future__ import division
import sys,time
= '#'
for in range(1,61):
    += '#'
    sys.stdout.write(str(int((i/60)*100))+'%  ||'+j+'->'+"\r")
    sys.stdout.flush()
    time.sleep(0.1)

方案二

1
2
3
4
5
6
import sys
import time
for in range(1,61):
    sys.stdout.write('#'+'->'+"\b\b")
    sys.stdout.flush()
    time.sleep(0.5)

方案三

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from progressbar import *
import time
import os
rows, columns = os.popen('stty size''r').read().split() #获取控制台size   
console_width=int(columns)
total = 10
progress = ProgressBar()
def test():
    '''
    进度条函数,记录进度
    '''
    for 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安装路径

1
2
from distutils.sysconfig import get_python_lib
print get_python_lib

获取当前python版本

1
2
sys.version_info
sys.version

获取当前时间

1
c=time.ctime()

#自定义格式输出

1
2
ISOTIMEFORMAT=%Y-%m-%%X’
time.strftime( ISOTIMEFORMAT, time.localtime() )

查看系统环境变量

1
os.environ["PATH"]

获取系统磁盘

1
os.popen("wmic VOLUME GET Name")

获取当前路径(包括当前py文件名)

1
os.path.realpath(__file__)

当前平台使用的行终止符

1
os.linesep

获取终端大小

1
2
3
4
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

1
ip= socket.getaddrinfo(domain,'http')[0][4][0]

获取服务器版本信息

1
2
3
sUrl = 'http://www.163.com'
sock = urllib2.urlopen(sUrl)
sock.headers.values()

文件操作
open函数,使用wb、rb代替w、r

1
2
with open("test.txt","wr") as w:
    w.write("test")

这种写法可以兼容python2/3。
输出一个目录下所有文件名称

1
2
3
4
5
6
7
8
def search(paths):
    if os.path.isdir(paths):  #如果是目录
          files=os.listdir(paths)  #列出目录中所有的文件
          for in files:
               i=os.path.join(paths,i)  #构造文件路径
               search(i)           #递归
          elif os.path.isfile(paths): #如果是文件
               print paths   #输出文件名

文件查找

1
2
3
4
5
6
import glob
print glob.glob(r"E:/*.txt")     #返回的是一个列表
查找文件只用到三个匹配符:”*”, “?”, “[]“
*”匹配0个或多个字符;
”?”匹配单个字符;
”[]“匹配指定范围内的字符,如:[0-9]匹配数字。

查找指定名称的文件夹的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

数据操作
判断数据类型

1
isinstance("123",(int,long,float,complex)

字符串(string)
去掉小数点后面的数字

1
2
a=1.21311
b=Int(math.floor(a))

字符串倒置

1
2
>>> a =  "codementor"
>>> a[::-1]

字符串首字母变大写

1
2
3
info = 'ssfef'
print info.capitalize()
print info.title()

返回一个字符串居中,并使用空格填充至长度width的新字符串。

1
"center string".center(width) #width设置为控制台宽度,可控制输出的字符串居中。

列举所有字母

1
2
3
print string.ascii_uppercase 所有大写字母
print string. ascii_lowercase 所有小写字母
print string.ascii_letters 所有字母(包括大小写)

列表(list)
列表去重

1
2
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))

判断列表为空

1
2
a=[]
if not a:

列表运算

1
2
3
4
5
a=[1,2,3]
b=[3,4,5]
set(a)&set(b) 与
set(a)|set(b) 或
set(a)-set(b) 非

单列表元素相加

1
2
3
= ["Code""mentor""Python""Developer"]
>>> print " ".join(a)
Code mentor Python Developer

多列表元素分别相加

1
2
3
4
5
6
7
8
list1 = ['a''b''c''d']
list2 = ['p''q''r''s']
>>> for x, y inzip(list1,list2): 
        print x, y
ap
bq
cr
ds

将嵌套列表转换成单一列表

1
2
3
4
= [[12], [34], [56]]
>>> import itertools
>>> list(itertools.chain.from_iterable(a))
[123456]

列表内元素相加

1
2
a=[1,2,3](数字)
sum(a)

产生a-z的字符串列表

1
map(chr,range(97,123))

列表复制

1
2
a=[1,2,3]
b=a

当对b进行操作时,会影响a的内容,因为共用一个内存指针,b=a[:] 这样就是单独复制一份了。

列表推导
if+else配合列表解析

1
[i if i >5 else -for in range(10)]

多层嵌套列表

1
2
3
4
a=[[1,2],[3,4]]
b=[for in for in a]
print b
[1,2,3,4]

生成一个生成器,调用next方法,可以减少内存开支。

1
a=(i else i+1 for in if i==1)

字典推导
更换key与value位置

1
2
dict={"a":1,"b":2}
b={value:key for key value in dict.items()}

字典操作(dict)
筛选出值重复的key

1
2
3
4
5
6
list1=self.dict_ip.items()            
        ddict=defaultdict(list)
        for k,v in list1:
            ddict[v].append(k)
        list2=[(i,ddict[i]) for in ddict if len(ddict[i])>1]
        dict_ns=dict(list2)

字典排序(py2)

1
2
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排序。

字典值判断

1
2
3
b={"a":1}
a=b.get("a","")  #如果不存在a,则返回””
c=if else 0  #如果存在a,则返回a,不然返回0

模块操作
导入模块时,设置只允许导入的属性或者方法。

1
2
3
4
5
6
7
8
9
10
fb.py:
-----------------------
__all__=["a","b"]
a="123"
c="2345"
def b():
    print 123
-----------------------
from fb import *
可以导入__all__内定义的变量,a跟b()可以导入,c不行。如果不定义__all__则所有的都可以导入。

导入上级目录下的包

1
2
sys.path.append("..")
from spider.spider_ import spider_

导入外部目录下的模块

1
需要在目标目录下创建__init__.py文件,内容随便

增加模块属性

1
2
3
4
有时候源代码中,我们需要写上自己的名字以及版本介绍信息,可以用__name__的方式定义。
a.py:
#! -*- coding:utf-8 -*-
__author__="nMask"

然后当我们导入a这个模块的时候,可以输出dir(a)看看

1
2
3
4
5
>>> import p
>>> print dir(p)
['__author__''__builtins__''__doc__''__file__''__name__''__package__']
>>> print p.__author__
nmask

动态加载一个目录下的所有模块

1
2
3
4
5
6
7
8
9
10
11
目录:
---test
   ----a.py
   ----b.py
---c.py
c.py导入test下面的所有模块:
for path in ["test"]:
    for in list(set([os.path.splitext(i)[0for in os.listdir("./"+path)])):
        if i!="__init__" and i!=".DS_Store"##排除不必要的文件
            import_string = "import path+"."+i+"
            exec import_string #执行字符串中的内容

函数操作
eval/exec

1
2
3
def test(content):
    print content
exec(“test(‘abc')”)

输出:abc
说明:exec函数没有返回值

1
2
3
def test(content):
    return content
print eval(“test(‘abc')”)

输出:abc
说明:eval函数有返回值

装饰器函数
输出当前时间装饰器

1
2
3
4
5
def current_time(aclass):
    def wrapper():
        print "[Info]NowTimeis:",time.ctime()
        return aclass()
    return wrapper

itertools迭代器

1
2
3
p=product(["a","b","c","d"],repeat=2)
----
[("a","a"),("b","b")......]

reduce函数
函数本次执行的结果传递给下一次。

1
2
3
4
def test(a,b):
    return a+b
reduce(test,range(10))
结果:从0+1+2......+9

enumerate函数
输入列表元素以及序列号

1
2
3
n=["a","b","c"]
for i,m in enumerate(n):
    print(i,m)

函数超时时间设置
@于2017.05.27更新
利用signal设置某个函数执行的超时时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import time
import 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 in range(1,10):
        fuc_time(1)

函数出错重试
利用retrying模块实现函数报错重试功能

1
2
3
4
5
6
7
import random
from retrying import retry
@retry
def have_a_try():
    if random.randint(010) != 5:
        raise Exception('It'not 5!')
    print 'It'5!'

如果我们运行have_a_try函数,那么直到random.randint返回5,它才会执行结束,否则会一直重新执行,关于该模块更多的用法请自行搜索。

程序操作
@于2017.05.27更新

Ctrl+C退出程序
利用signal实现ctrl+c退出程序。

1
2
3
4
5
6
7
8
9
10
11
12
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)
# 当你按下Ctrl-C的时候,应该会输出一段话,并退出.

程序自重启
利用os.execl方法实现程序自重启

1
2
3
4
5
6
7
8
9
10
11
12
import time
import sys
import os
def 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()
posted @ 2017-07-12 14:55  八颗牙齿晒太阳  阅读(121)  评论(0编辑  收藏  举报