Python【NO.5】:模塊

模塊,用一砣代碼實現了某個功能的代碼集合html

相似於函數式編程和麪向過程編程,函數式編程則完成一個功能,其餘代碼用來調用便可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能須要多個函數才能完成(函數又能夠在不一樣的.py文件中),n個 .py 文件組成的代碼集合就稱爲模塊。python

爲了實現某一個功能,且是實現的全部代碼的集合。
  因此它存在形式有2中:
         一個.py文件,
         文件夾(包)算法

如:os 是系統相關的模塊;file是文件操做相關的模塊shell

模塊分爲三種:編程

  • 自定義模塊
  • 內置模塊
  • 開源模塊

導入模塊 json

導入模塊有一下幾種方法:bash

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 文件

 開源模塊

1、下載安裝網絡

下載安裝有兩種方式:app

方式一:
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/

2、導入模塊

同自定義模塊中導入的方式:

3、模塊 paramiko

paramiko是一個用於作遠程控制的模塊,使用該模塊能夠對遠程服務器進行命令或文件操做,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來現實。

一、下載安裝

# 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
# 進入python環境,導入Crypto檢查是否安裝成功

# 下載安裝 paramiko

wget http://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檢查是否安裝成功

 二、使用模塊

執行命令 - 經過用戶名和密碼鏈接服務器
#!/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使用

 

內置模塊

1、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所指向的文件或者目錄的最後修改時間

 更多猛擊這裏

 

2、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]

更多猛擊這裏

 

3、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

4、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"))

5、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
相關文章
相關標籤/搜索