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  in zip (list1,list2): 
         print  x, y
ap
bq
cr
ds

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

1
2
3
4
=  [[ 1 2 ], [ 3 4 ], [ 5 6 ]]
>>>  import  itertools
>>>  list (itertools.chain.from_iterable(a))
[ 1 2 3 4 5 6 ]

列表内元素相加

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)[ 0 for  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( 0 10 ) ! =  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()

转载于:https://www.cnblogs.com/liaojintian/p/7155463.html

你可能感兴趣的:(python)