python基础4-常见模块
前言1:模块是什么?
模块,用一系列代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
前言2:模块以怎样的方式存在的?
存在方式:
1.存在.py文件里面
2.存在"某某"文件夹里面(但是文件里面必须包含__init__.py文件)
如:os 是系统相关的模块;file是文件操作相关的模块
前言3:模块的种类有哪几种?
模块分为三种:
自定义模块
内置模块
开源模块
自定义模块
1、定义模块(多个.py文件包含在一个文件夹里面,要想直接导入使用这个文件夹作为包,必须在里面建一个__init_.py,有无代码都没关系,如下图所示)
2、导入模块,导入模块其实就是告诉Python解释器去解释那个py文件
Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
import module from module.xx.xx import xx功能 from module.xx.xx import xx as rename #取别名 from module.xx.xx import *
注意:
1.多个.py文件包含在一个文件夹里面,要想直接导入使用这个文件夹作为包,必须在里面建一个__init_.py,有无代码都没关系。
2.导入一个包,解释器解释该包下的 __init__.py 文件
导入模块时是根据那个路径作为基准来进行的呢?即:sys.path
import sys print sys.path 结果: ['E:\\Code\\Py.Code\\PY4\\py1123', 'E:\\Code\\Py.Code\\PY4', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
通过os模块可以获取各种目录,例如:
================ import sys import os pre_path = os.path.abspath('../') sys.path.append(pre_path) ===================
3.开源模块
开源模块是怎么下载安装的呢?
下载安装有如下两种方式:
方式1:
yum pip apt-get ...
方式2:
下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.py install 注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行: yum install gcc yum install python-devel 或 apt-get python-dev 安装成功后,模块会自动安装到 sys.path 中的某个目录中,如: /usr/lib/python2.7/site-packages/ 安装成功后,模块会自动安装到 sys.path 中的某个目录中,如: /usr/lib/python2.7/site-packages/
常见模块总结(os、sys、hashlib、json和pickle、re、time、random)
一、os----用于提供系统级别的操作
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径<====>pwd
>>> import os >>> os.getcwd() '/root' >>> os.chdir("/mnt") >>> os.getcwd() '/mnt' >>> os.chdir("/root")
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规范化的绝对路径,path----> "相对路径名" os.path.split(path) 将path分割成目录和文件名二元组返回,path--->"/root/python" 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所指向的文件或者目录的最后修改时间
二、sys---用于提供对解释器相关的操作
sys.argv 以List的方式返回命令行参数,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),非正常exit(n),n不为0 sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.maxunicode 最大的Unicode值 sys.path 返回python寻找模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') #在python-shell中输出括号里的信息但不换行 val = sys.stdin.readline()[:-1] ===>raw_input()
三、hashlib ---关于加密的模块
============================= import hashlib hash = hashlib.md5() #以md5的方式进行加密,这里md5可以换成sha算法(sha1,sha256,sha384,sha512) hash.update('jachy') #加密的内容为jachy print hash.hexdigest() #打印加密生成的密钥 ea3c504ef548c2b435435975665b3f3c ============加入key弥补存在缺陷,即:通过网上专门有人撞库可以反解。所以有必要对加密算法中添加自定义key再来做加密。==================== >>> import hashlib >>> hash = hashlib.md5('the key') #在hashlib.md5('要加的key信息')自定义 >>> hash.update('tanjie') >>> print hash.hexdigest() 5cdfcbac297e0116513da99fc7429ade =========================
四、json 和 pickle,主要用于序列化
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
json模块和pickle都提供了四个功能:dumps、dump、loads、load
=========pickle示例============ >>> import pickle >>> data = {'k1':123,'k2':'hello'} >>> p_str = pickle.dumps(data) #将数据用特殊的形式转化成python语言认识的字符串 >>> print p_str (dp0 S'k2' p1 S'hello' p2 sS'k1' p3 I123 s. >>> with open('/root/txt','w') as fp: #将data转换成p_str的形式里(即python语言任何的字符串)面的内容写入到/root/txt文件里面 ... pickle.dump(data,fp) ============json的运用==================== >>> import json >>> j_str = json.dumps(data) #将data转换成任何语言都任何的字符串 >>> print j_str >>> with open('/root/txt1','w') as fp: #将data转换成任何语言都任何的字符串并将字符串写入到/root/txt1文件里面 ... json.dump(data,fp) ...
五、re,re模块用于对python的正则表达式的操作。
字符:
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
次数:
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
示例:匹配IP和匹配手机号
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}$
re模块的常见方法:
1、match(pattern, string, flags=0)
从起始位置开始根据模型去字符串中匹配指定内容,匹配单个
正则表达式,要匹配的字符串,标志位(用于控制正则表达式的匹配方式)
import re obj = re.match('\d+', '123uuasf') if obj: print obj.group()
2、search(pattern, string, flags=0)
根据定义的模式去字符串中匹配指定内容,匹配单个
import re obj = re.search('\d+', 'u123uu888asf') if obj: print obj.group() a = "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group() print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0) print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1) print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2)
3、group和groups
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()
4、findall(pattern, string, flags=0)
上述两中方式均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。
>>> import re >>> obj = re.findall('\d+','adfasd324234dasf') #以列表的形式返回 >>> print obj ['324234']
5、sub(pattern, repl, string, count=0, flags=0)
用于替换匹配的字符串,相比于str.replace功能更加强大
>>> content = "123afadf342" >>> new_content = re.sub('\d+','F',content) #将匹配到的内容用F替换 >>> print new_content FafadfF >>> new_content = re.sub('\d+','F',content,1) #将第一次匹配到的内容用F替换 >>> print new_content Fafadf342 content = "123abc456" new_content = re.sub('\d+', 'sb', content) # new_content = re.sub('\d+', 'sb', content, 1) print new_content
6、split(pattern, string, maxsplit=0, flags=0)
根据指定匹配进行分组,相比于str.split更加强大
>>> content = "'1-2 * (60-30+1*(9-2*5/3))'" >>> new_content = re.split('\*',content) #\*用于转义*,这里是指用*将字符串分割,并以列表的形式返回 >>> print new_content ["'1-2 ", ' (60-30+1', '(9-2', "5/3))'"] >>> new_content = re.split('\*',content,1) #按第1个*进行分割,并以列表的形式返回 >>> print new_content ["'1-2 ", " (60-30+1*(9-2*5/3))'"] c>>> 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,1) #按+ - * /将整个字符进行分割,只分割第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) )'"] inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))' inpp = re.sub('\s*','',inpp) new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1) print new_content
六.执行系统shell命令相关的模块
1.subprocess模块
1.call方法
================================================= >>> ret = subprocess.call("cat txt",shell=True) >>subprocess.call(["ls","-l"],shell=False)) 注意:shell==True表示允许shell命令时字符串形式 ================================================
2.check_call方法
执行命令,如果执行状态码是 0 ,则返回0,否则抛异常
================================================= subprocess.check_call(["ls", "-l"]) subprocess.check_call("exit 1", shell=True) =================================================
3.check_output方法
执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常
================================================= subprocess.check_output(["echo", "Hello World!"]) subprocess.check_output("exit 1", shell=True) =================================================
4.Popen命令,用于执行复杂命令
================================================== >>> ret1 = subprocess.Popen(["mkdir","t1"]) #创建在当前目录下,创建名为t1的目录 >>> ret2 = subprocess.Popen("mkdir t2",shell=True) #创建在当前目录下,创建名为t1的目录 =================================================== ======================指明当前目录cwd为/root/python====================== >>> obj = subprocess.Popen("mkdir t3",shell=True,cwd='/root/python',)
2、shutil模块,高级的 文件、文件夹、压缩包 处理模块
1.shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中,可以部分内容
2.shutil.copyfile(src, dst)
拷贝文件
3.shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变
4.shutil.copystat(src, dst)
拷贝状态的信息,包括:mode bits, atime, mtime, flags
5.shutil.copy(src, dst)
拷贝文件和权限
6.shutil.copy2(src, dst)
拷贝文件和状态信息
7.shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件
例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
8.shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
9.shutil.move(src, dst)
递归的去移动文件
10.shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如:www =>保存至当前路径
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
===================================================== #将 /Users/Downloads/test 下的文件打包放置当前程序目录 import shutil ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/Downloads/test') #将 /Users/Downloads/test 下的文件打包放置 /Users/目录 import shutil ret = shutil.make_archive("/Users/wwwwwwwwww", 'gztar', root_dir='/Users/Downloads/test')
七.ConfigParser
示例: >>> import ConfigParser,sys >>> config = ConfigParser.ConfigParser() #创建ConfigParser对象 >>> config.add_section("message") #添加section,即[message] >>> config.set("message","name","jachy") #然后为section添加内容1:name = jachy >>> config.set("message","age","22") #添加内容2:age = 22 >>> config.add_section("address") #添加第二个section,即[address] >>> config.set("address","address","sichuan") #然后为setcion添加内容1:address = sichuan >>> config.write(sys.stdout) #然后写入配置文件,并输入到终端上 [message] name = jachy age = 22 [address] address = sichuan >>> config.items('message') #从section(这里指的是message)中读取内容,并以列表的形式返回 [('name', 'jachy'), ('age', '22')] >>> config.items('address') [('address', 'sichuan')] >>> config.remove_option('address','address') #从section中(这里指address)移除address选项信息 True >>> config.write(sys.stdout) [message] name = jachy age = 22 [address] >>> config.add_section("phone") #增加section信息,这里指phone >>> config.write(sys.stdout) [message] name = jachy age = 22 [address] [phone] >>> config.set('phone','k1','v1') #向section中的phone增加option信息:k1 = v1 >>> config.write(sys.stdout) [message] name = jachy age = 22 [address] [phone] k1 = v1 >>> config.remove_option('phone','k1') #从section中:phone,里面移除option:k1 True >>> config.write(sys.stdout) [message] name = jachy age = 22 [address] [phone] >>> config.write(open('t1.txt','w')) #将config里面的信息写入到t1.txt文件中 [root@localhost ~]# cat t1.txt [message] name = jachy age = 22 [address] [phone]
八.time模块,时间相关的操作,时间有三种表示方式:
1.时间戳 1970年1月1日之后的秒,即:time.time()
2.格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
3.结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
================================= >>> import time >>> time.time() 1448509967.387637 >>> time.strftime('%Y-%m-%d') '2015-11-26' >>> time.localtime() time.struct_time(tm_year=2015, tm_mon=11, tm_mday=26, tm_hour=11, tm_min=53, tm_sec=37, tm_wday=3, tm_yday=330, tm_isdst=0) >>> import datetime >>> print datetime.datetime.now() #打印当前的时间 2015-11-26 16:41:33.462807
九.random模块
>>> import random >>> print random.random() #生成随机数 0.636789536881 >>> print random.random() 0.0304092540837 >>> print random.randint(1,2) #在1-2之间生成随机整数 2 >>> print random.randint(1,2) 2 >>> print random.randint(1,10) #在1-10之间生成随机整数 6 >>> print random.randint(1,10) 3