模块,用一砣代码实现了某个功能的代码集合
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
为了实现某一个功能,且是实现的所有代码的集合。
所以它存在形式有2中:
一个.py文件,
文件夹(包)
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块
- 内置模块
- 开源模块
导入模块
导入模块有一下几种方法:
import sys #导入模块 from sys import argv #导入模块某个功能 from sys import argv as abc #别名,防止功能重名 from sys import * #导入模块所有功能
C:\Python27\lib\site-packages #开源模块默认存放位置,可以直接导入
import sys
#C:\Python27\lib\site-packages #开源模块默认存放位置,可以直接导入
for i in sys.path:
print i
#########result#############
D:\11期python\day5 #自动把执行的文件的当前路径加入path里
C:\Python27\lib\site-packages\paramiko-1.16.0-py2.7.egg
C:\Python27\lib\site-packages\ecdsa-0.13-py2.7.egg
D:\11期python\day5
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
import sys #导入模块 sys.path.append('D:\\') #使用某个模块,就要加载模块的路径 ############### import sys import os pre_path = os.path.abspath('../') #通过os模块可以获取各种目录 sys.path.append(pre_path)
导入模块其实就是告诉Python解释器去解释那个py文件
- 导入一个py文件,解释器解释该py文件
- 导入一个包,解释器解释该包下的 __init__.py 文件
开源模块
一、下载安装
下载安装有两种方式:
方式一:
yum pip apt-get ...
方式二: 下载源码 解压源码 进入目录 编译源码 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/
二、导入模块
同自定义模块中导入的方式:
三、模块 paramiko
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
1、下载安装
# pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto # 下载安装 pycrypto wget https://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 # 进入python环境,导入Crypto检查是否安装成功 # 下载安装 paramiko wget https://files.cnblogs.com/files/wupeiqi/paramiko-1.10.1.tar.gz tar -xvf paramiko-1.10.1.tar.gz cd paramiko-1.10.1 python setup.py build python setup.py install # 进入python环境,导入paramiko检查是否安装成功
2、使用模块
执行命令 - 通过用户名和密码连接服务器 #!/usr/bin/env python #coding:utf-8 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.108', 22, 'alex', '123') stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close(); 执行命令 - 过密钥链接服务器 import paramiko private_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('主机名 ', 端口, '用户名', key) stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close() 上传或者下载文件 - 通过用户名和密码 import os,sys import paramiko t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test.py','/tmp/test.py') t.close() import os,sys import paramiko t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test.py','/tmp/test2.py') t.close() 上传或下载文件 - 通过密钥 import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test3.py','/tmp/test3.py') t.close() import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test3.py','/tmp/test4.py') t.close()
内置模块
一、os
用于提供系统级别的操作
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 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规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 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) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') val = sys.stdin.readline()[:-1]
更多猛击这里
三、hashlib 和 hmac 模块
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
hmac模块实现了hmac算法,需要一个key来进行加密
import md5 hash = md5.new() hash.update('admin') print hash.hexdigest()
import sha hash = sha.new() hash.update('admin') print hash.hexdigest()
>>> import hashlib >>> for i in dir(hashlib):print i ... __all__ __builtins__ __doc__ __file__ __get_builtin_constructor __name__ __package__ _hashlib algorithms algorithms_available algorithms_guaranteed md5 new pbkdf2_hmac sha1 sha224 sha256 sha384 sha512
查看hashlib加密类型
>>> hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
# ######## md5 ######## hash = hashlib.md5() hash.update('abc') print hash.hexdigest() 900150983cd24fb0d6963f7d28e17f72 # ######## sha1 ######## hash = hashlib.sha1() hash.update('abc') print hash.hexdigest() a9993e364706816aba3e25717850c26c9cd0d89d # ######## sha256 ######## hash = hashlib.sha256() hash.update('abc') print hash.hexdigest() ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad # ######## sha384 ######## hash = hashlib.sha384() hash.update('abc') print hash.hexdigest() cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 # ######## sha512 ######## hash = hashlib.sha512() hash.update('abc') print hash.hexdigest() ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
1 import hashlib 2 # ######## md5 ######## 3 >>> hash = hashlib.md5("sljldjf") 4 >>> hash.update("abc") 5 >>> print hash.hexdigest() 6 b878ac8ea0974a1c1f0d6db8cbd57e02
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
>>> import hmac >>> hash = hmac.new("oooooo") >>> hash.update("abc") >>> print hash.hexdigest() 9b9b40a51d23843684c038d03792397b
四、ConfigParser
用于对特定的配置进行操作,当前模块的名称在 python 3.x 版本中变更为 configparser
import ConfigParser
config = ConfigParser.ConfigParser() #创建实例
config.read('abc.cnf') #读取配置文件
# ########## 读 ##########
#secs = config.sections() #返回配置文件中节序列
#print secs #['section1', 'section2']
#options = config.options('sction1') #返回某个项目中的所有键的序列
#print options #['k1', 'k2']
#item_list = config.items('section1') #获取sections下所有键值对
#print item_list #[('k1', 'v1'), ('k2', 'v2')]
#val = config.get('group1','key') #得到section中option的值,返回为string类型
#val = config.getint('group1','key') #得到section中option的值,再执行int()
# ########## 改写 ##########
#sec = config.remove_section('section1') #内存中删除section
#config.write(open('abc.cnf', "w")) #重新config内存中所有数据
#sec = config.remove_option('section2','k1') #删除section中某一个option
#sec = config.has_section('section3') #有没有这个section,返回bool型
#sec = config.add_section('section3') #添加一个section,存在则报错
#config.write(open("abc.cnf", "w"))
#config.set('section2','k1',11111) #设置section节点中,键名为option的值(val),section不存在则报错
#config.write(open('abc.cnf', "w"))
五、json 和 pickle
用于序列化的两个模块
- json,用于字符串 和 python数据类型间进行转换
- pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
Json 可以做到不同程序内存之间的交换,但只能转换一般常用的格式。
两个独立程序间内存是隔离的,程序之间交互可以通过网络(只能发字符串)、硬盘(存储格式只能是字符串)。
pickle 可以序列化大部分数据类型
>>> import json >>> for i in dir(json):print i ... JSONDecoder JSONEncoder __all__ __author__ __builtins__ __doc__ __file__ __name__ __package__ __path__ __version__ _default_decoder _default_encoder decoder dump #将数据通过特殊的形式转换为所有程序都认识的字符串,并写入文件 dumps #将数据通过特殊的形式转换为所有程序都认识的字符串 encoder load loads scanner
重要函数
编码:把一个Python对象编码转换成Json字符串 json.dumps()
解码:把Json格式字符串解码转换成Python对象 json.loads()
## 解码: json.loads(),把Json格式字符串解码转换成Python对象 >>> import json >>> s = json.loads('{"name":"abc","type":{"name":"seq","parameter":["1","2"]}}') >>> print s.keys() [u'type', u'name'] >>> print s['type'] {u'parameter': [u'1', u'2'], u'name': u'seq'} >>> print s['type']['name'] seq ##编码: json.dumps(),把一个Python对象编码转换成Json字符串 >>> data = {'a':123,"b":[1,2]} >>> d1 = json.dumps(data) >>> type(data) <type 'dict'> >>> type(d1) <type 'str'> >>> d2 = json.loads(d1) >>> type(d2) <type 'dict'>
############# dumps 编码后的json格式字符串紧凑的输出,而且也没有顺序,因此dumps方法提供了一些可选的参数,让输出的格式提高可读性,如sort_keys是告诉编码器按照字典排序(a到z)输出 排序 sort_keys=True data1 = {'b':789,'c':456,'a':123} data2 = {'a':123,'b':789,'c':456} d1 = json.dumps(data1,sort_keys=True) d2 = json.dumps(data2) d3 = json.dumps(data2,sort_keys=True) >>> print d1 {"a": 123, "b": 789, "c": 456} >>> print d2 {"a": 123, "c": 456, "b": 789} >>> print d3 {"a": 123, "b": 789, "c": 456} >>> print d1==d2 False 缩进参数 indent参数根据数据格式缩进显示,读起来更加清晰 data1 = {'b':789,'c':456,'a':123} d1 = json.dumps(data1,sort_keys=True,indent=4) >>> print d1 { "a": 123, "b": 789, "c": 456 } separators参数的作用是去掉,,:后面的空格,在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数: import json data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ] print 'DATA:', repr(data) print 'repr(data) :', len(repr(data)) print 'dumps(data) :', len(json.dumps(data)) print 'dumps(data, indent=2) :', len(json.dumps(data, indent=2)) print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':'))) >>> json.dumps(data) '[{"a": "A", "c": 3.0, "b": [2, 4]}]' >>> json.dumps(data,indent=2) '[\n {\n "a": "A", \n "c": 3.0, \n "b": [\n 2, \n 4\n ]\n }\n]' >>> json.dumps(data,separators=(',',':')) '[{"a":"A","c":3.0,"b":[2,4]}]' ###### dunmp 将数据通过特殊的形式转换为所有程序都认识的字符串,并写入文件 import json readed = json.load(open('jsonsource.dat', 'r')) json.dump(readed, open('newjsonfile.dat', 'w')) 或者 with open('D:/result.json','w') as fp: json.dump(data,fp)
浙公网安备 33010602011771号