Python之模块
模块:是实现某一功能的代码的集合,类似于一个函数。模块在使用时直接导入即可。
导入模块,其实就是告诉python解释器去解释这个导入的py文件。若导入的是一个包,则python解释器去解释该包里面的__init__.py文件。
模块导入的时候,是以sys.path作为基准。
>>> import sys >>> print sys.path ['', '/usr/local/lib/python2.7/dist-packages/distribute-0.6.28-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/MySQL_python-1.2.4b4-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/pandas-0.16.2-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/numpy-1.9.2-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/pytz-2015.4-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/python_dateutil-2.4.2-py2.7.egg', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
一、开源模块
导入开源模块时,需要现安装该模块包。
两种安装方式:
1、在线安装:yum、pip、apt-get
2、编译安装:下载源码包->解压->编译(python setup.py build)->安装(python setup.py install)
确认安装成功后,即可导入使用。
eg:
安装:
# pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto # 下载安装 pycrypto wget https://files.cnblogs.com/files/wupeiqi/pycrypto-2.6.1.tar.gz tar -xvf pycrypto-2.6.1.tar.gz cd pycrypto-2.6.1 python setup.py build python setup.py install # 进入python环境,导入Crypto检查是否安装成功 # 下载安装 paramiko wget https://files.cnblogs.com/files/wupeiqi/paramiko-1.10.1.tar.gz tar -xvf paramiko-1.10.1.tar.gz cd paramiko-1.10.1 python setup.py build python setup.py install # 进入python环境,导入paramiko检查是否安装成功
使用:
#!/usr/bin/env python #coding:utf-8 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.108', 22, 'alex', '123') stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close();
二、内置模块
1、os模块
主要用于系统管理的操作
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.environ 获取系统环境变量 os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
2、sys模块
主要用于对解释器相关的操作
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') val = sys.stdin.readline()[:-1]
3、pickle模块
主要用于序列化的操作
pickle:python特有类型和python数据类型之间的转换
该模块有dump、dumps、load、loads四个方法
pickle.dumps 将数据通过特殊的形式转换成只有pyton才能识别的字符串。
>>> import pickle >>> data = {'1':123,'2':456} >>> print pickle.dumps(data) (dp0 S'1' p1 I123 sS'2' p2 I456 s.
pickle.dump 主要对文件进行操作,它将数据过特殊的形式转换成只有pyton才能识别的字符串,并写入文件。
>>> with open('result.pk','w') as f: ... pickle.dump(data,f) ... >>>
pickle.loads 与dumps相对应,将特殊的字符串转换成python中的数据类型。
>>> import pickle >>> s = [1,2,3,4] >>> p1 = pickle.dumps(s) >>> print p1 (lp0 I1 aI2 aI3 aI4 a. >>> s1 = pickle.loads(p1) >>> print s1 [1, 2, 3, 4]
pickle.load 与dump相对应,将特殊字符串的文件抓换成字符串。
>>> import pickle >>> f = open('result.pk','r') >>> s = pickle.load(f) >>> print s {'1': 123, '2': 456}
4、logging模块
用于日志记录
eg:
import logging logging.warning("user [alex] attempted wrong password more than 3 times") logging.critical("server is down") #输出 WARNING:root:user [alex] attempted wrong password more than 3 times CRITICAL:root:server is down
把日志写入文件:
import logging logging.basicConfig(filename='example.log',level=logging.INFO) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too')
其中下面这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。
logging.basicConfig(filename='example.log',level=logging.INFO)
加上时间:
import logging logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') logging.warning('is when this event was logged.')
5、time模块
与时间有关的操作
时间有三种表示方式:
- 时间戳 1970年1月1日之后的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
eg:
>>> import time >>> print time.time() 1457588586.28 >>> print time.mktime(time.localtime()) 1457588652.0 >>> print time.gmtime() time.struct_time(tm_year=2016, tm_mon=3, tm_mday=10, tm_hour=5, tm_min=44, tm_sec=33, tm_wday=3, tm_yday=70, tm_isdst=0) >>> print time.strftime('%Y-%m-%d') 2016-03-10 >>> import datetime >>> print datetime.datetime.now() 2016-03-10 13:49:32.833639 >>> print datetime.datetime.now() - datetime.timedelta(days=1) 2016-03-09 13:50:25.230468
6、re模块
用于正则匹配
字符:
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
次数:
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
IP: ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$ 手机号: ^1[3|4|5|8][0-9]\d{8}$
match(pattern, string, flags=0)
从起始位置开始根据模型去字符串中匹配指定内容,匹配单个.
- 正则表达式
- 要匹配的字符串
- 标志位,用于控制正则表达式的匹配方式
>>> import re >>> obj = re.match('\d+','123fkdfk') >>> print obj.group() 123
search(pattern, string, flags=0)
根据模型去字符串中匹配指定内容,匹配单个。
>>> obj = re.search('\d+','u12323fdkfl') >>> print obj.group() 12323
findall(pattern, string, flags=0)
上述两中方式均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。
>>> obj = re.findall('\d+','fdf343dfldfj098dfdf') >>> print obj ['343', '098']
sub(pattern, repl, string, count=0, flags=0)
用于替换匹配的字符串
>>> content = '123jkfjkf678' >>> new_content = re.sub('\d+','sb',content)#将数字替换成'sb' >>> print new_content sbjkfjkfsb
split(pattern, string, maxsplit=0, flags=0)
根据指定匹配进行分组
>>> content = "'1-2*((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'" >>> new_content = re.split('\*',content) >>> print new_content ["'1-2", '((60-30+1', '(9-2', '5/3+7/3', '99/4', '2998+10', '568/14))-(-4', '3)/(16-3', "2))'"] >>> >>> new_content = re.split('[\+\-\*\/]+',content) >>> print new_content ["'1", '2', '((60', '30', '1', '(9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14))', '(', '4', '3)', '(16', '3', "2))'"] >>> >>> content = "'1-2*((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'" >>> content = re.sub('\s*','',content) >>> new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)',content,1) >>> print new_content ["'1-2*((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-", '-4*3', "/(16-3*2))'"]
7、random模块
主要生成随机数
>>> import random >>> print random.random() 0.645138583945 >>> print random.randint(1,4) 3 >>> print random.randrange(1,20) 10
生成验证码
>>> import random >>> checkcode = '' >>> for i in range(4): ... current = random.randrange(0,4) ... if current != i: ... temp = chr(random.randint(65,90)) ... else: ... temp = random.randint(0,9) ... checkcode +=str(temp) ... >>> print checkcode PBXE