python常用模块
模块,用一砣代码实现了某个功能的代码集合
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个.py文件组成的代码集合就称为模块。
如os是系统相关的模块,file是文件操作相关的模块
模块分为三种:
自定义模块
内置模块
开源模块
2.导入模块
python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入,导入模块有以下几种方法:
1 | import module |
导入模块其实就是告诉python解释器去解释那个py文件
导入一个py文件,解释器解释该py文件
导入一个包,解释器解释该包下的init.py文件
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path
1 | import sys |
如果sys.path路径列表没有你想要的路径,可以通过sys.path.append(‘路径’)添加。
通过os模块可以获取各种目录,例如:
1 | import sys |
开源模块
一、下载安装
下载安装有两种方式:
1 | yum |
1 | 下载源码 |
注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行:
1 | yum install gcc |
安装成功后,模块会自动安装到 sys.path 中的某个目录中,如:
1 | /usr/lib/python2.7/site-packages/ |
二、导入模块
同自定义模块中导入的方式
三、模块 paramiko
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
1、下载安装
1 | pip3 install paramiko |
或
1 | # pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto |
2、使用模块
1 | 执行命令 - 通过用户名和密码连接服务器 |
1 | 执行命令 - 过密钥链接服务器 |
1 | 上传或者下载文件 - 通过用户名和密码 |
1 | 上传或下载文件 - 通过密钥 |
内置模块
一、os
用于提供系统级别的操作
1 | os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 |
二、sys
用于提供对解释器相关的操作
1 | sys.argv 命令行参数List,第一个元素是程序本身路径 |
三、hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1 | md5废弃 |
1 | sha废弃 |
1 | import hashlib |
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
1 | import hashlib |
还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
1 | import hmac |
四、json 和 pickle
用于序列化的两个模块
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
五、执行系统命令
可以执行shell命令的相关模块和函数有:
1 | os.system |
1 | import commands |
以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。
call
执行命令,返回状态码
1 | ret = subprocess.call(["ls", "-l"], shell=False) |
shell = True ,允许 shell 命令是字符串形式
check_call
执行命令,如果执行状态码是 0 ,则返回0,否则抛异常
1 | subprocess.check_call(["ls", "-l"]) |
check_output
执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常
1 | subprocess.check_output(["echo", "Hello World!"]) |
subprocess.Popen(…)
用于执行复杂的系统命令
参数:
1 | args:shell命令,可以是字符串或者序列类型(如:list,元组) |
1 | import subprocess |
终端输入的命令分为两种:
输入即可得到输出,如:ifconfig
输入进行某环境,依赖再输入,如:python
1 | import subprocess |
1 | import subprocess |
1 | import subprocess |
1 | import subprocess |
六、shutil
高级的 文件、文件夹、压缩包 处理模块
shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中,可以部分内容
1 | def copyfileobj(fsrc, fdst, length=16*1024): |
shutil.copyfile(src, dst)
拷贝文件
1 | def copyfile(src, dst): |
shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变
1 | def copymode(src, dst): |
shutil.copystat(src, dst)
拷贝状态的信息,包括:mode bits, atime, mtime, flags
1 | def copystat(src, dst): |
shutil.copy(src, dst)
拷贝文件和权限
1 | def copy(src, dst): |
shutil.copy2(src, dst)
拷贝文件和状态信息
1 | def copy2(src, dst): |
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件
例如:copytree(source, destination, ignore=ignore_patterns(‘.pyc’, ‘tmp‘))
1 | def ignore_patterns(*patterns): |
shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
1 | def rmtree(path, ignore_errors=False, onerror=None): |
shutil.move(src, dst)
递归的去移动文件
1 | def move(src, dst): |
shutil.make_archive(base_name, format,…)
创建压缩包并返回文件路径,例如:zip、tar
1 | base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径, |
1 | def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, |
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
1 | zipfile 压缩解压 |
1 | tarfile 压缩解压 |
1 | ZipFile |
1 | TarFile |
七、ConfigParser
用于对特定的配置进行操作,当前模块的名称在 python 3.x 版本中变更为 configparser。
1 | # 注释1 |
1 | import ConfigParser |
八、logging
用于便捷记录日志且线程安全的模块
1 | import logging |
对于等级:
1 | CRITICAL = 50 |
只有大于当前日志等级的操作才会被记录。
对于格式,有如下属性可是配置:
九、time
时间相关的操作,时间有三种表示方式:
时间戳 1970年1月1日之后的秒,即:time.time()
格式化的字符串 2014-11-11 11:11, 即:time.strftime(‘%Y-%m-%d’)
结构化时间 元组包含了:年、日、星期等… time.struct_time 即:time.localtime()
1 | print time.time() |
十、re
re模块用于对python的正则表达式的操作。
1 | 字符: |
1、match(pattern, string, flags=0)
从起始位置开始根据模型去字符串中匹配指定内容,匹配单个
正则表达式
要匹配的字符串
标志位,用于控制正则表达式的匹配方式
1 | import re |
1 | # flags |
2、search(pattern, string, flags=0)
根据模型去字符串中匹配指定内容,匹配单个
1 | import re |
3、group和groups
1 | a = "123abc456" |
4、findall(pattern, string, flags=0)
上述两中方式均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。
1 | import re |
5、sub(pattern, repl, string, count=0, flags=0)
用于替换匹配的字符串
1 | content = "123abc456" |
相比于str.replace功能更加强大
6、split(pattern, string, maxsplit=0, flags=0)
根据指定匹配进行分组
1 | content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'" |
1 | content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'" |
1 | inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))' |
相比于str.split更加强大
实例:计算器源码
1 | #!/usr/bin/env python |
十一、random
随机数
1 | import random |
验证验证码实例:
1 | import random |