目录:
1、模块介绍
2、time & datetime
3、random
4、OS
5、sys
6、shutil
7、json & pickle
8、shelve
9、xml 处理
10、YAML 处理
11、configparser
12、hashlib
13、subprocess
14、logging
What is module?
模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程完成一个功能,其它代码用来调用即可,模块提供了代码的重用性和代码间的耦合。对于一个复杂的功能来说,可能需要多个函数才能完成(函数又可以在不同的 .py 文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file 是文件操作相关的模块。
模块分为三种:
- 自定义模块(自己编写的模块)
- 内置标准模块(又称标准库)
- 开源模块(网络上下载别人编写的模块)
- pypi.python.org (Python 官方提供的开源模块下载地址)
模块解耦:
让程序之间的关联性变低,通俗的讲就是减少模块间的互相干扰,让各个模块的修改变化尽可能小的影响其它模块。
2、导入模块
Python 之所以应用越来越广泛,在一定程序上也依赖于其为程序员提供了大量的模块使用,如果想要使用模块,有如下几种导入方法:
import module #导入整个模块 from module.xx.xx import xx # 从某个模块目录中倒入某个方法(. 相当于路径分隔符,例如:from backend.db.sql_api import select) from module.xx.xx import xx as rename # 从某个模块目录中倒入某个方法,并对方法进行重命名 from module.xx.xx import * # 将模块下的所有方法都倒入(模块太多,容易产生冲突,覆盖另一个重名模块)
导入模块其实就是告诉 Python 解释器去解释对应的 py 文件
- 导入一个 py 文件,解释器解释该 py 文件
- 导入一个包,解释器解释该包下的 __init__.py 文件
导入模块时,会根据系统默认的搜索路径,按照预先定义好的路径顺序搜索指定模块:
sys.path:列表,列表中存放的是全局搜索路径,倒入模块时会循环 sys.path 列表中的所有路径,以第一次找到的模块名为准。
import sys # 倒入 sys 模块 print (sys.path) # 打印方法中存放的路径 结果: ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages'] # 其中第一个路径为Python 当前工作目录,最后一个路径 '/usr/local/lib/python3.4/site-packages' 专门用来存放第三方开源模块,放在这个目录中直接 import 即可倒入
如果 sys.path 路径列表中没有你想要的路径,可以通过 sys.path.append('路径') 添加。
通过 os 模块可以获取目录名,例如:
import sys import os pre_path = os.path.abspath('../') # 此时将 python 运行目录的上层目录保存至 pre_path 变量中 sys.path.append(pre_path) # 将pre_path 加入模块搜索路径 print (sys.path) ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages', '/'] # / 已经被加入 sys.path 模块搜索路径的尾部
如果一个自定义模块想要被 from 倒入,它一定要是包格式,也就是说目录内必须存在 __init__.py 文件。
__init__.py:功能是将目录变为一个包,允许通过 . 的方式倒入。
__file__:当前程序从执行位置起的相对路径(在哪个目录下调用该程序,就会打印哪个目录起至程序的路径)
# Python 文件当前所在目录 /root/test1/test2 vim test.py #!/usr/bin/env python print (__file__) #保存 # 从当前目录下执行 test.py python test.py # __file__ 中保存的就是 Python 文件名 test.py # 从上级目录执行 test.py python test2/test.py # __file__ 中保存的是调用Python 的目录 + 文件名 test2/test.py # 从*目录执行 test.py python /root/test1/test2/test.py # __file__ 中保存的就是*目录 + 文件名 /root/test1/test2/test.py
那有朋友就问了 __file__ 中保存的只是相对路径,而我需要当前程序的绝对路径怎么办?
vim test.py import os print (os.path.abspath(__file__)) # 保存 python test.py # 直接在相对路径下调用 test.py 文件,打印出了绝对路径 /root/test1/test2/test.py
开源模块
下载安装有两种方式:
yum pip # Python 官方提供的专门用来安装开源模块的命令 # 例:pip install openunipay apt-get ……
1 下载源码包 2 解压源码包 3 进入解压后的源码包目录 4 编译译码 5 python setup.py build 6 安装源码 7 python setup.py install
注:在使用源码安装时,需要使用 gcc 编译器编译和 Python 开发包,所以,需要先执行:
yum install gcc yum install python-devel 或 apt-get python-dev
安装成功后,模块会自动安装到 sys.path 中专门存放第三方开源模块的目录中:
/usr/blib/python3.4/site-packages/
三、模块 paramiko
paramiko 是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,fabric 和 ansible 内部的远程管理就是使用 paramiko 来实现。
1、下载安装:
# pycrypto,由于 paramiko 模块内部依赖 pycrypto,所以先下载安装 pycrypto # 下载安装 pycrypto wget http://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 # 模块编译成功后会放置在模块所在目录 build/ 下,mv 至对应 python 版本存放开源模块的目录中 mv build/lib.linux-x86_64-3.4/Crypto /usr/local/lib/python3.4/site-packages/ # 进入 python 环境,导入 Crypto 检查安装是否成功 import Crypto # 下载安装 paramiko wget http://files.cnblogs.com/files/wupeiqi/paramiko-1.10.1.tar.gz
常用内置模块
用于提供系统级别操作
# os.getcwd() 获取当前 Python 脚本工作路径 os.getcwd() /root/test1/test2/ # os.chdir("dirname") 改变当前脚本工作目录;相当于 Shell 中 cd 命令 os.chdir("/etc/") os.getcwd() /etc/ # os.curdir 返回当前目录:('.') os.curdir '.' # os.pardir 获取当前目录的父目录字符串名:('..') os.pardir '..' # os.makedirs('dirname1/dirname2') 递归创建多层目录(创建在当前脚本工作目录下) os.makedirs('dir01/dir02/dir03') # os.removedirs('dirname1') 指定目录为空,则删除,并退到上一级目录,上级目录如为空,则删除,一直递归下去 os.removedirs('/root/test01/test02/test03') # /root/test01/ 目录下除 test02/ 外没有任何内容,会一直删到 /root/ 目录为止(目录下必须为空才可删除) # os.mkdir('dirname') # 创建单级目录;相当于 shell 中 mkdir dirname os.mkdir('/root/test01') # 只能创建单层目录 # os.rmdir('dirname') # 删除单级空目录,若目录不为空则报错;相当于 shell 中 rmdir ('/root/test01/') # os.listdir('dirname') # 以列表方式打印出指定目录下的所有文件和子目录,包含隐藏文件 os.listdir('/root/') ['.bash_logout', '.bash_profile', '.bashrc', '.cshrc', '.tcshrc', 'anaconda-ks.cfg', '.bash_history', 'test.py', 'test2.py', 'a', 'b', 'c', 'root', 'test.txt', '.lesshst', 'Python-3.4.3.tgz', 'Python-3.4.3', '.viminfo', 'dir01', 'test01'] # os.remove() 删除一个文件 os.remove('/root/test.txt') # os.rename("oldname","newname") 重命名文件/目录 os.rename('/root/test01/','/root/haha01') # os.stat('path/filename') 获取文件/目录信息 os.stat('/root/haha01') os.stat_result(st_mode=16877, st_ino=68783296, st_dev=2053, st_nlink=3, st_uid=0, st_gid=0, st_size=32, st_atime=1446357817, st_mtime=1446357760, st_ctime=1446358064) # os.sep 输出操作系统特定的路径分隔符,win 下为 "\\",Linux 下为 "/" os.sep '/' # os.linesep 输出当前平台使用的行终止符,win 下为 "\r\n",Linux下为 "\n" os.linesep '\n' # os.pathsep 输出用于分割文件路径的字符串 os.pathsep ":" # os.name 得到系统内置变量,用来区分当前平台 win-->'nt';linux-->'posix' os.name "posix" # os.system("bash command") 运行 shell 命令,并显示返回内容与返回值 os.system("date") 2015年 11月 01日 星期日 14:21:23 CST 0 # os.environ 获取系统环境变量,并以字典形式输出 os.environ environ({'SHLVL': '1', 'LANG': 'zh_CN.UTF-8', 'MAIL': '/var/spool/mail/root', 'USER': 'root', 'TERM': 'xterm', 'SSH_CONNECTION': '192.168.1.4 56590 192.168.1.8 22' …………………………}) # os.path.abspath(path) 返回 path 规范化的绝对路径 os.path.abspath('a/test') # test.py 必须在当前工作目录下 '/root/a/test' #os.path.split(path) # 将 path 的目录部分与文件名部分保存为元组中两个元素 os.path.split(os.getcwd()) ('/root/a', 'enterprise') #os.path.dirname(path) # 返回 path 的目录部分,其实就是 os.path.split(path) 的第一个元素(并不会检测目录是否真实存在) os.path.dirname(os.getcwd()) '/root/a' # os.basename(path) # 返回 path 最后的文件名;如果 path 以 / 或 \ 结尾,那么就会返回空值,即 os.path.split(path) 的第二个元素(并不会检测文件是否真实存在) os.path.basename('/root/a/test') 'test' os.path.basename('/root/a/test/') ' ' #os.path.exists(path) # 如果 path 存在,返回 True;如果 path 不存在,返回 False os.path.exists('/root/a/fdsfsd') False #os.path.isabs() # 如果 path 是绝对路径,返回 True (并不会path是否真实存在) os.path.isabs('/root/a/fdsfsd') True os.path.isabs('fdsfsd/') False # os.path.isfile(path) # 如果 path 是一个存在的文件,返回 True。否则返回 False os.path.isfile('/root/a/fdsf') False os.path.isfile('/root/a/test') True # os.path.isdir(path) # 如果 path 是一个存在的目录,则返回 True,否则返回 False os.path.isdir('/root/a/') True os.path.isdir('/root/aa/') False # os.path.join(path[,path2[, ...]]) # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.join('/etc/root','a','test','aaa') '/etc/root/a/test/aaa' # os.path.getatime(path) # 以时间戳格式返回 path 所指向的文件或目录的最后存取时间(path 不存在会报错) os.path.getatime('/root/a') 1446360249.3873208 # os.path.getmtime(path) # 以时间戳格式返回 path 所指向的文件或目录的最后修改时间(path 不存在会报错) os.path.getmtime('/root/a') 1446360021.658315