记录我的成长吧~

模块,用一砣代码实现了某个功能的代码集合

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.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()
paramiko使用

 

内置模块

一、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()
MD5-已废弃
import sha

hash = sha.new()
hash.update('admin')
print hash.hexdigest()
sha-已废弃
>>> 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加密类型

>>> 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
hashlib加密

 以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义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
json中的方法

重要函数
编码:把一个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'>
json编码解码
#############
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)
json中dumps与dump

 

posted on 2015-11-25 02:29  徐长伟  阅读(214)  评论(0)    收藏  举报