一、模块的定义及类型
1、定义
模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里,而如果有些功能实现起来很复杂,那么就需要创建n个.py文件,这n个.py文件的集合就是模块
2、类型
1)自定义模块,自己写的实现自己某些功能需求的.py文件集合
2)导入的模块
在你安装python之后,它自己内部的lib文件下就有很多模块可以用,导入后就可以使用,通常路径是C:\Python27\Lib (27是版本号,如果是3.5的版本就是C:\Python35\Lib)
3)第三方开源模块
第三方开源模块通常需要自己去下载,这里以linux和windows系统为例子说明
linux系统
1 # 下载安装 pycrypto 2 3 wget http://files.cnblogs.com/files/wupeiqi/pycrypto-2.6.1.tar.gz 4 5 tar -xvf pycrypto-2.6.1.tar.gz 6 7 cd pycrypto-2.6.1 8 9 python setup.py build 10 11 python setup.py install
1 #注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行 2 3 yum install gcc 4 5 yum install python-devel 6 或者 7 apt-get python-dev
安装成功后,模块会自动安装到 sys.path 中的某个目录中,如/usr/lib/python3.5/site-packages
windows系统
1.源码安装
1.设置python的环境变量 A.控制面板-系统和安全-系统-高级系统设置-环境变量-系统变量-path B.将python安装目录添加到里面,我的是C:\Python35 2.到网上下载你需要的模块,并解压,里面有setup.py文件 3.打开Cmd(命令提示符),切换到解压模块的目录 4.运行命令:1、setup.py build --> 2、setup.py install 5.重新打开python IDE, import xxx (模块名称 ),没报错则安装成功
2.用pip3安装
或者直接切换到 C:\Python35\Lib\site-packages目录下安装 用pip3 install xxx(要安装的模块名称)然后它就会自己下载了,很简单
二、python的模块的导入方式
#主要包括以下几种导入方式: 1、import moduels(模块名字) #导入整个模块,这种导入方式比较占用内存 2、import moduels (模块名字) as XX #这里是导入整个模块的同时给它取一个别名,因为有些模块名字比较长,用一个缩写的别名代替在下次用到它时就比较方便 3、from modules(模块名字) import func(方法) #从一个模块里导入方法,你要用到模块里的什么方法就从那个模块里导入那个方法,这样占用的内存就比较少 也可以用别名表示 : from modules(模块名字) import func(方法)as XX 4、from package.modules import func(方法) #从一个包的模块里导入方法 这个方法跟上面那种基本一样,占用的内存也比较少 也可以用别名表示,from modules(模块名字) import func(方法)as XX
导入模块其实就是告诉Python解释器去解释那个py文件
导入一个py文件,解释器解释该py文件 导入一个包,解释器解释该包下的 __init__.py 文件
模块导入的路径是以什么为标准的呢,就是以sys.path来查看
1 >>> import sys 2 >>> print(sys.path) 3 ['', 'C:\\Users\\shaopeng\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\idlelib',
'C:\\Users\\shaopeng\\AppData\\Local\\Programs\\Python\\Python35\\python35.zip',
'C:\\Users\\shaopeng\\AppData\\Local\\Programs\\Python\\Python35\\DLLs',
'C:\\Users\\shaopeng\\AppData\\Local\\Programs\\Python\\Python35\\lib',
'C:\\Users\\shaopeng\\AppData\\Local\\Programs\\Python\\Python35',
'C:\\Users\\shaopeng\\AppData\\Local\\Programs\\Python\\Python35\\lib\\site-packages']
如果你要导入的模块不在这些路径下面,你就可以用sys.path.append('你要导入的绝对路径')
三、python当中用到的模块不少,这里介绍一些常用的模块
os 模块
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 3 os.curdir 返回当前目录: ('.') 4 os.pardir 获取当前目录的父目录字符串名:('..') 5 os.makedirs('dirname1/dirname2') 可生成多层递归目录 6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 10 os.remove() 删除一个文件 11 os.rename("oldname","newname") 重命名文件/目录 12 os.stat('path/filename') 获取文件/目录信息 13 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 14 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 15 os.pathsep 输出用于分割文件路径的字符串 16 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 17 os.system("bash command") 运行shell命令,直接显示 18 os.environ 获取系统环境变量 19 os.path.abspath(path) 返回path规范化的绝对路径 20 os.path.split(path) 将path分割成目录和文件名二元组返回 21 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 22 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 24 os.path.isabs(path) 如果path是绝对路径,返回True 25 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 26 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 27 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 28 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 29 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
sys 模块
用于提供对解释器相关的操作
1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0) 3 sys.version 获取Python解释程序的版本信息 4 sys.maxint 最大的Int值 5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 6 sys.platform 返回操作系统平台名称 7 sys.stdout.write('please:') 8 val = sys.stdin.readline()[:-1]
hashlib 模块
1 import hashlib 2 3 4 5 # ######## md5 ######## 6 7 8 9 hash = hashlib.md5() 10 11 hash.update('admin') 12 13 print hash.hexdigest() 14 15 16 17 # ######## sha1 ######## 18 19 20 21 hash = hashlib.sha1() 22 23 hash.update('admin') 24 25 print hash.hexdigest() 26 27 28 29 # ######## sha256 ######## 30 31 32 33 hash = hashlib.sha256() 34 35 hash.update('admin') 36 37 print hash.hexdigest() 38 39 40 41 42 43 # ######## sha384 ######## 44 45 46 47 hash = hashlib.sha384() 48 49 hash.update('admin') 50 51 print hash.hexdigest() 52 53 54 55 # ######## sha512 ######## 56 57 58 59 hash = hashlib.sha512() 60 61 hash.update('admin') 62 63 print hash.hexdigest() 64 65 66 以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密
import hashlib # ######## md5 ######## hash = hashlib.md5('898oaFs09f') hash.update('admin') print hash.hexdigest() #还不够的话,python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密 import hmac h = hmac.new('wueiqi') h.update('hellowo') print h.hexdigest()
json 和 pickle 模块(用于序列化的两个模块)
json--用于字符串 和 python数据类型间进行转换 (可以用到其他编程语言中去)
pickle--用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
>>> import pickle >>> data_dic = {'k1':1,'k2':2} #将数据通过特殊的形式转换为只有python语言认识的字符串 >>> data_str = pickle.dumps(data_dic) >>> print(data_str) b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K\x01X\x02\x00\x00\x00k2q\x02K\x02u.' #将只有python语言认识的字符串转换成数据 >> data_str2 = pickle.loads(data_str) >>> print(data_str2) {'k1': 1, 'k2': 2} #将数据通过特殊的形式转换为只有python语言认识的字符串,写入文件 >>> with open('D:/pickdumpsresult.pk','wb') as f: pickle.dump(data_dic,f) >>> import json #将数据通过特殊的形式转换为全部语言都认识的字符串 >>> j_str = json.dumps(data_dic) >>> print(j_str) {"k1": 1, "k2": 2} #将数据通过特殊的形式转换为全部语言都认识的字符串,并写入文件 >>> with open('D:/result.json','w') as f: json.dump(data_dic,f) #将全部语言都认识的字符串转换成数据 >>> data_str3 = json.loads(j_str) >>> print(data_str3) {'k1': 1, 'k2': 2}
执行系统命令
可以执行shell命令的相关模块和函数有: •os.system •os.spawn* •os.popen* --废弃 •popen2.* --废弃 •commands.* --废弃,3.x中被移除
下面是在python2.7版本中用commands
>>> import commands >>> result = commands.getoutput('cmd') >>> print(result) '{' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 >>> result1 = commands.getstatus('cmd') >>> print(result1) '{' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 >>> result2 = commands.getstatusoutput('cmd') >>> print(result2) (1, "'{' \xb2\xbb\xca\xc7\xc4\xda\xb2\xbf\xbb\xf2\xcd\xe2\xb2\xbf\xc3\xfc\xc1\xee\xa3\xac\xd2\xb2\xb2\xbb\xca\xc7\xbf\xc9\xd4\xcb\xd0\xd0\xb5\xc4\xb3\xcc\xd0\xf2\n\xbb\xf2\xc5\xfa\xb4\xa6\xc0\xed\xce\xc4\xbc\xfe\xa1\xa3")
以上提到的模块执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能
call
执行命令,返回状态码
>>> ret = subprocess.call("ls -l", shell=True) >>> print(ret) 1
#shell = True ,允许 shell 命令是字符串形式,默认是False?
check_call
执行命令,如果执行状态码是 0 ,则返回0,否则抛异常
1 check_call 2 3 >>> ret = subprocess.check_call("ls -l", shell=True) 4 Traceback (most recent call last): 5 File "<pyshell#31>", line 1, in <module> 6 ret = subprocess.check_call("ls -l", shell=True) 7 File "C:\Users\shaopeng\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 584, in check_call 8 raise CalledProcessError(retcode, cmd) 9 subprocess.CalledProcessError: Command 'ls -l' returned non-zero exit status 1
check_output
执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常
1 >>> subprocess.check_output(["echo", "Hello World!"]) 2 Traceback (most recent call last): 3 File "<pyshell#33>", line 1, in <module> 4 subprocess.check_output(["echo", "Hello World!"]) 5 File "C:\Users\shaopeng\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 629, in check_output 6 **kwargs).stdout 7 File "C:\Users\shaopeng\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 696, in run 8 with Popen(*popenargs, **kwargs) as process: 9 File "C:\Users\shaopeng\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 950, in __init__ 10 restore_signals, start_new_session) 11 File "C:\Users\shaopeng\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 1220, in _execute_child 12 startupinfo) 13 FileNotFoundError: [WinError 2] 系统找不到指定的文件。 14 >>> subprocess.check_output("exit 1", shell=True) 15 Traceback (most recent call last): 16 File "<pyshell#34>", line 1, in <module> 17 subprocess.check_output("exit 1", shell=True) 18 File "C:\Users\shaopeng\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 629, in check_output 19 **kwargs).stdout 20 File "C:\Users\shaopeng\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 711, in run 21 output=stdout, stderr=stderr) 22 subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
subprocess.Popen(...)
用于执行复杂的系统命令
参数: •args:shell命令,可以是字符串或者序列类型(如:list,元组) •bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲 •stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄 •preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用 •close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。 所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。 •shell:同上 •cwd:用于设置子进程的当前目录 •env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。 •universal_newlines:不同系统的换行符不同,True -> 同意使用 \n •startupinfo与createionflags只在windows下有效 将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
1 import subprocess 2 ret1 = subprocess.Popen(["mkdir","t1"]) 3 ret2 = subprocess.Popen("mkdir t2", shell=True)
#终端输入的命令分为两种:1、输入即可得到输出,如:ifconfig 2、输入进行某环境,依赖再输入,如:python
import subprocess obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
1 import subprocess 2 3 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 4 obj.stdin.write('print 1 \n ') 5 obj.stdin.write('print 2 \n ') 6 obj.stdin.write('print 3 \n ') 7 obj.stdin.write('print 4 \n ') 8 obj.stdin.close() 9 10 cmd_out = obj.stdout.read() 11 obj.stdout.close() 12 cmd_error = obj.stderr.read() 13 obj.stderr.close() 14 15 print cmd_out 16 print cmd_error
1 import subprocess 2 3 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 4 obj.stdin.write('print 1 \n ') 5 obj.stdin.write('print 2 \n ') 6 obj.stdin.write('print 3 \n ') 7 obj.stdin.write('print 4 \n ') 8 9 out_error_list = obj.communicate() 10 print out_error_list
11 out_error_list = obj.communicate('print "hello"')
12 print out_error_list
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: 组,默认当前组
- logger: 用于记录日志,通常是logging.Logger对象
#将 /Users/weishaopeng/Downloads/test 下的文件打包放置当前程序目录 import shutil ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/weishaopeng/Downloads/test') #将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录 import shutil ret = shutil.make_archive("/Users/weishaopeng/wwwwwwwwww", 'gztar', root_dir='/Users/weishaopeng/Downloads/test')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的:
import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall() z.close() import tarfile # 压缩 tar = tarfile.open('your.tar','w') tar.add('/Users/weishaoepeng/PycharmProjects/bbs2.zip', arcname='bbs2.zip') tar.add('/Users/weishaopeng/PycharmProjects/cmdb.zip', arcname='cmdb.zip') tar.close() # 解压 tar = tarfile.open('your.tar','r') tar.extractall() # 可设置解压地址 tar.close()
ConfigParser
用于对特定的配置进行操作,当前模块的名称在 python 3.x 版本中变更为 configparser
1 [section1] 2 3 k1 = v1 5 k2:v2 9 [section2] 10 11 k1 = v1 83 import ConfigParser 87 config = ConfigParser.ConfigParser() 88 89 config.read('i.cfg') 93 # ########## 读 ########## 94 95 #secs = config.sections() 96 97 #print secs 98 99 #options = config.options('group2') 100 101 #print options 105 #item_list = config.items('group2') 106 107 #print item_list 111 #val = config.get('group1','key') 112 113 #val = config.getint('group1','key') 114 115 116 117 # ########## 改写 ########## 118 119 #sec = config.remove_section('group1') 120 121 #config.write(open('i.cfg', "w")) 125 #sec = config.has_section('wupeiqi') 126 127 #sec = config.add_section('wupeiqi') 128 129 #config.write(open('i.cfg', "w")) 135 #config.set('group2','k1',11111) 136 137 #config.write(open('i.cfg', "w")) 141 #config.remove_option('group2','age') 142 143 #config.write(open('i.cfg', "w"))
logging
用于便捷记录日志且线程安全的模块
import logging logging.basicConfig(filename='log.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=10) logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical') logging.log(10,'log')
等级分为:
CRITICAL = 50 FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0
time
时间相关的操作,时间有三种表示方式:
- 时间戳 1970年1月1日之后的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
print time.time() print time.mktime(time.localtime()) print time.gmtime() #可加时间戳参数 print time.localtime() #可加时间戳参数 print time.strptime('2014-11-11', '%Y-%m-%d') print time.strftime('%Y-%m-%d') #默认当前时间 print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间 print time.asctime() print time.asctime(time.localtime()) print time.ctime(time.time()) import datetime ''' datetime.date:表示日期的类。常用的属性有year, month, day datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond datetime.datetime:表示日期时间 datetime.timedelta:表示时间间隔,即两个时间点之间的长度 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) strftime("%Y-%m-%d") ''' import datetime print datetime.datetime.now() print datetime.datetime.now() - datetime.timedelta(days=5)
random
import random print random.random() print random.randint(1,2) print random.randrange(1,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