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