python reload
作用:
对已经加载的模块进行重新加载,一般用于原模块有变化等特殊情况,reload前该模块必须已经import过。
说明:
reload会重新加载已加载的模块,但原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块;reload后还是用原来的内存地址;不能支持from。。import。。格式的模块进行重新加载。
>>> import sys
>>> sys.setdefaultencoding('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf8')
上面第一次的测试会失败,那么为什么要在调用setdefaultencoding时必须要先reload一次sys模块呢?因为这里的import语句其实并不是sys的第一次导入语句,也就是说这里其实可能是第二、三次进行sys模块的import,这里只是一个对sys的引用,只能reload才能进行重新加载;那么为什么要重新加载,而直接引用过来则不能调用该函数呢?因为setdefaultencoding函数在被系统调用后被删除了,所以通过import引用进来时其实已经没有了,所以必须reload一次sys模块,这样setdefaultencoding才会为可用,才能在代码里修改解释器当前的字符编码。试试下面的代码:
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf8')
>>> del sys.setdefaultencoding
>>> sys.setdefaultencoding('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>>
那么到底是谁在之前就导入sys并且调用了setdefaultencoding函数呢?答案就在python安装目录的Lib文件夹下,有一个叫site.py的文件【python2.6】,在里面可以找到main() –> setencoding()–>sys.setdefaultencoding(encoding),因为这个site.py每次启动python解释器时会自动加载,所以main函数每次都会被执行,setdefaultencoding函数一出来就已经被删除了。
/usr/lib64/python2.7/site.py
python startswith
说明:
Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。
在下面的代码中可以看到,我当前的django版本为1.10.5,当我从1.10及1.10.5开头检查字符串,返回的值为True,从1.11开头检查字符串,返回值为False。
>>> import django
>>> django.get_version()
'1.10.5'
>>> django.get_version().startswith('1.10')
True
>>> django.get_version().startswith('1.10.5')
True
>>> django.get_version().startswith('1.11')
False
python split
说明:
Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串
从下面的代码中可以看到,我通过os.environ来获取ssh客户端的环境变量,split默认将空格作为分隔符;将下列信息分为ip,remote port及local port,接着我通过index来获取每条信息。
>>> import os
>>> os.environ['SSH_CLIENT'].split()
['192.168.141.1', '54821', '22']
>>> os.environ['SSH_CLIENT'].split()[0]
'192.168.141.1'
>>> os.environ['SSH_CLIENT'].split()[1]
'54821'
>>> os.environ['SSH_CLIENT'].split()[2]
'22'
python strip
说明:
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
下面的代码中一开始通过read()得到 ()和\n,但需求只是需要里面的IP地址,所以通过strip将\n和()进行移除
>>> import os
>>> os.popen("who -m | awk '{print $NF}'").read()
'(192.168.141.1)\n'
>>> os.popen("who -m | awk '{print $NF}'").read().strip('()\n')
'192.168.141.1'
python re.sub
说明:
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
在下面的代码中,通过re.sub进行匹配及替换,将phone变量中的所有的a-z,A-Z,@,#,$替换为空。
>>> phone = '@[1A10|#119|AAA120]$'
>>> re.sub(r'[a-zA-Z@#$]', '', phone)
'[110|119|120]'
python 输出字符颜色函数
下面的代码用来输出不同颜色的字符,color_print 中定义了三个参数,分别为msg,color=’red’,exits=False;其中,msg就是要输出的字符串,color则是定义具体颜色,如果不定义,则默认为red,exists则是为了下面的判断。
msg = color_msg.get(color) % msg 该条信息中,color_msg.get(color) 用来获取具体的颜色的value,然后% msg将替换value中的%s,替换完成之后value的值也就是
\033[1;31m msg_info \033[0m。当执行函数后,打印出的字符颜色就是red,当然还可以自定义color=’[red|green|yellow]’
#!/usr/bin/python
# -*- coding:utf-8 -*-
def color_print(msg, color='red', exits=False):
"""
Print colorful string.
颜色打印字符或者退出
"""
color_msg = {'blue': '\033[1;36m%s\033[0m',
'green': '\033[1;32m%s\033[0m',
'yellow': '\033[1;33m%s\033[0m',
'red': '\033[1;31m%s\033[0m',
'title': '\033[30;42m%s\033[0m',
'info': '\033[32m%s\033[0m'}
msg = color_msg.get(color) % msg
print msg
if exits:
time.sleep(2)
sys.exit()
return msg
color_print('hello')
颜色输出如下:
color_print('hello')
color_print('hello', color='green')
color_print('hello', color='blue')
python compile
说明:
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
下面的代码中,Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
一个简单的例子,寻找一个字符串中所有的英文字符:
>>> pattern = re.compile('[a-zA-Z]')
>>> result = pattern.findall('fwafwai@#%^%$')
>>> print result
['f', 'w', 'a', 'f', 'w', 'a', 'i']