吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9625|回复: 22
收起左侧

[Python 转载] python奇技淫巧

  [复制链接]
nmask 发表于 2017-4-20 16:47
本帖最后由 nmask 于 2017-4-20 17:18 编辑

分享点python奇技淫巧

内容来自博客:http://thief.one/2017/04/19/1/

控制台操作控制台不闪退

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

text=""
while 1:
    data=raw_input(">>")
    if data.strip()=="stop":
        break
    text+="%s\n" % data
print text
---------------------------
>>1
>>2
>>3
>>stop
1
2
3
同行输出

1
2

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
8

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
j = '#'
for i in range(1,61):
    j += '#'
    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 i 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
23
24
25

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 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安装路径

1
2

from distutils.sysconfig import get_python_lib
print get_python_lib
获取当前时间

1
2
3
4

c=time.ctime()
#自定义格式输出
ISOTIMEFORMAT=’%Y-%m-%d %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

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()
文件操作输出一个目录下所有文件名称

1
2
3
4
5
6
7
8

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   #输出文件名
文件查找

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
16
17

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
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

a = ["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

a = [[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
3

a=[1,2,3]
b=a
当对b进行操作时,会影响a的内容,因为共用一个内存指针,b=a[:] 这样就是单独复制一份了。
列表解析if+else配合列表解析

1

[i if i >5 else -i for i in range(10)]
字典操作(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) for i in ddict if len(ddict)>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
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 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 #执行字符串中的内容
函数操作装饰器函数输出当前时间装饰器

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

免费评分

参与人数 11吾爱币 +10 热心值 +10 收起 理由
浪子彦 + 1 + 1 希望楼主可以继续更新!
小胖啊小胖 + 1 + 1 这一波可以,全部给你
onoffon + 1 用心讨论,共获提升!
chqsb123 + 1 + 1 用心讨论,共获提升!
Franz + 1 + 1 谢谢@Thanks!
c文字 + 1 我很赞同!
xinluan + 1 + 1 热心回复!
yyltwin + 1 + 1 已答复!
lin_xop + 1 + 1 热心回复!
nonsafety + 1 + 1 热心回复!
artificial5 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| nmask 发表于 2017-4-20 17:20
plaodj 发表于 2017-4-20 17:12
楼主这是来干啥?    特别是最后那个尾巴???

留个来路呗,嘿嘿。
plaodj 发表于 2017-4-20 17:12
楼主这是来干啥?    特别是最后那个尾巴???
artificial5 发表于 2017-4-20 17:13
逝雪之殤 发表于 2017-4-20 17:15
纯手打的吗
 楼主| nmask 发表于 2017-4-20 17:17

那不是的,之前写在博客里,在此分享一下
kendling 发表于 2017-4-20 18:07
学习了。。
Nelsonyang 发表于 2017-4-20 18:14
前排马克一下 刚好想学py
心飞扬 发表于 2017-4-20 19:14
楼主这是来干啥?
TBCCC 发表于 2017-4-20 20:22
有好多挺有意思的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 22:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表