python模塊

来源:http://www.cnblogs.com/linkenpark/archive/2016/02/27/5222203.html
-Advertisement-
Play Games

模塊概念:用一砣代碼實現了某個功能的代碼集合。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。 模塊分為


模塊概念:用一砣代碼實現了某個功能的代碼集合。

類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。

模塊分為三種:

1、自定義模塊

2、內置模塊

3、開源模塊

 

1、自定義模塊

 1、導入模塊

導入模塊方法:

import module
from module.xx.xx import xx
from module.xx.xx import xx as rename     #給導入模塊取別名
from module.xx.xx import *    #導入module.xx.xx 文件中的所有函數、變數、類等

導入模塊其實就是告訴Python解釋器去解釋那個py文件

  • 導入一個py文件,解釋器解釋該py文件
  • 導入一個包,解釋器解釋該包下的 __init__.py 文件

導入模塊時是根據那個路徑作為基準來進行的呢?即:sys.path

import sys
print(sys.path)

列印結果:
['E:\\Lab\\python\\s12\\day6', 'E:\\Lab\\python\\s12', 'E:\\Python\\Python35\\python35.zip', 'E:\\Python\\Python35\\DLLs', 'E:\\Python\\Python35\\lib', 'E:\\Python\\Python35', 'E:\\Python\\Python35\\lib\\site-packages']

#這裡會把當前運行的py文件路徑、項目根路徑、python常用變數添加到sys.path,sys.path返回的是一個列表

 

例子:

現在目錄結構如下:

 

(1)、根目錄下的 .py文件里調用子目錄 .py文件

註意:from DIR_PATH  import py文件或py文件里的函數、類等

import後只能是 py文件或py文件里的

 

這裡也可以只導入某py文件中的某個函數等

 

(2)、子目錄調用另一個子目錄py包

導入包前需要把根路徑添加到path環境變數中,否則模塊將找不到而報錯,此方法僅適用於工作目錄py所在目錄,即需要在py目錄來執行運行。

pre_path = os.path.abspath('../')      #獲取根的path,os.path.abspath() 這裡傳當前路徑到根路徑的相對路徑
sys.path.append(pre_path)      #將根路徑追加到path環境變數中

 

任意工作目錄下獲取項目的根路徑:

pre_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# __file__ :獲取當前py文件的路徑

# os.path.abspath(__file__):獲取當前py文件的絕對路徑

# os.path.dirname(os.path.abspath(__file__)) :獲取當前py文件的目錄路徑

# s.path.dirname(os.path.abspath(__file__)) :獲取當前py文件的上一層的目錄路徑

 

 

2、開源模塊

下載安裝有兩種方式:

包管理工具安裝

yum
pip
apt-get

2.1 源碼安裝

下載源碼
解壓源碼
進入目錄
編譯源碼 python setup.py build
安裝源碼 python setup.py install

註:在使用源碼安裝時,需要使用到gcc編譯和python開發環境,所以先要安裝gcc及python-devvel

yum install gcc
yum install python-devel

apt-get python-dev

安裝成功後,模塊會自動安裝到 sys.path 中的某個目錄中,如:

/usr/lib/python2.7/site-packages/

2.2 導入模塊

導入模塊的方式同自定義模塊的導入方法

2.3 paramiko模塊

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

2.3.1 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檢查是否安裝成功 2.3.2 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()

 

3 內置模塊

 3.1 os模塊

用於提供系統級別的操作

os.getcwd()                      #獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") #改變當前腳本工作目錄;相當於shell下cd
os.curdir #返回當前目錄: ('.')
os.pardir # 獲取當前目錄的父目錄字元串名:('..')
os.makedirs('dir1/dir2') #makedirs(name, mode=0o777, exist_ok=False),可遞歸生成多層目錄,相當於shell下的mkdir -p
os.removedirs('path') #若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推。如 os.makedirs('dir1/dir2'),os.removedirs('dir1/dir2'),若dir1、dir2均為空上當時,將刪除dir1及dir1/dir2
os.mkdir('path') #os.mkdir(path ,mode=0o777) 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('path') #刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir(path) #列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式列印
os.remove(path) #刪除一個文件
os.rename('src', 'dst') #重命名文件/目錄 os.renames('old', 'new') 有相同功能
os.stat(path) #獲取文件/目錄信息
os.sep #輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep #輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep #輸出用於分割文件路徑的字元串 win下為";", Linux下為":"
os.name #輸出字元串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system(command) #運行shell命令command,直接顯示並顯示執行狀態,成功為0,每執行個os.system(command)新開一個shell臨時進程
os.environ #獲取操作系統環境變數
os.path.abspath(path) #返回path規範化的絕對路徑
os.path.split(path) #將path分割成目錄和文件名二元組返回 os.path.split('path')[0] 可獲取父路徑
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(filename) #返回path所指向的文件或者目錄的最後存取時間
os.path.getmtime(filename) 返回path所指向的文件或者目錄的最後修改時間、
os.path.getctime(filename)           #返回path所指向的文件或者目錄的創建時間
os.path.getsize(filename) #返回path所指向的文件或者目錄的大小

更多猛擊這裡
3.2 sys模塊

sys.argv                #獲取命令行參數List,第一個元素是程式本身路徑
sys.exit(n) #sys.exit(status=None) 退出程式,正常退出時exit(0)
sys.version #獲取Python解釋程式的版本信息
sys.maxsize #最大的Int值
sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform #返回操作系統平臺名稱.win-->'win32' linux -->'linux2'
sys.stdout.wirte('please:') #輸出
val = sys.stdin.readline()[:-1] #從行讀取並去掉回車符

 更多猛擊這裡

 3.3 hashlib模塊

用於加密相關的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法

md5--廢棄(deprecated)

import md5
hash = md5.new()
hash.update('admin')
print hash.hexdigest()
#列印結果:21232f297a57a5a743894a0e4a801fc3

sha--廢棄(deprecated)

 

import sha

hash = sha.new()
hash.update('admin')
print hash.hexdigest()
#列印結果:d033e22ae348aeb5660fc2140aec35850c4da997

用於加密相關的操作,3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法

import hashlib

m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())           #b']\xde\xb4{/\x92Z\xd0\xbf$\x9cR\xe3Br\x8a'
m.update(b"It's been a long time since last time we ...")

print(m.digest()) #2進位格式hash        #b'\xa0\xe9\x89E\x03\xcb\x9f\x1a\x14\xaa\x07?<\xae\xfa\xa5'
print(len(m.hexdigest())) #16進位格式hash   #32

# md5
h_md5 = hashlib.md5()
h_md5.update(b'admin')          #python 3.x 需要轉二進位,python 2.x 直接使用h_md5.update('admin'),Unicode-objects must be encoded before hashing
print(h_md5.hexdigest())         #21232f297a57a5a743894a0e4a801fc3

# sha1
h_sha1 = hashlib.sha1()
h_sha1.update(b'admin')
print(h_sha1.hexdigest())       #d033e22ae348aeb5660fc2140aec35850c4da997

# sha224
h_sha224 = hashlib.sha224()
h_sha224.update(b'admin')
print(h_sha224.hexdigest())     #58acb7acccce58ffa8b953b12b5a7702bd42dae441c1ad85057fa70b

# sha256
h_sha256 = hashlib.sha256()
h_sha256.update(b'admin')
print(h_sha256.hexdigest())     #8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

# sha384
h_sha384 = hashlib.sha384()
h_sha384.update(b'admin')
print(h_sha384.hexdigest())     #9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782

# sha512
h_sha512 = hashlib.sha512()
h_sha512.update(b'admin')
print(h_sha512.hexdigest())     #c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec

以上加密演算法雖然依然非常厲害,但時候存在缺陷,即:通過撞庫可以反解。所以,有必要對加密演算法中添加自定義key再來做加密。

import hashlib

# md5
h_m = hashlib.md5(b'mykey_1001')
h_m.update(b'admin')
print(h_m.hexdigest())      #f4e45c78302ae746e0b20c4ad1b889a6

 還不夠叼?python 還有一個 hmac 模塊,它內部先對我們創建的key 和 內容 進行處理,然後再加密

import hmac

h = hmac.new(b'jiami')
h.update(b'hello')
print(h.hexdigest())        #96e8ad3c5dc8c1eeb0bf510f40d0393e

更多關於md5,sha1,sha256等介紹的文章看這裡https://www.tbs-certificates.co.uk/FAQ/en/sha256.html 

 

3.4 json 和 pickle

用於義序列化

json:用於字元串 和 python數據類型間進行轉換(可與其他語言通用)

pickle:用於python特有的類型 和 python的數據類型間進行轉換(python特有,與其他語言不通用,可把字元串、字典、函數、類等寫入文件)

 json、pickle模塊都提供了4個功能:dumps、dump、loads、load

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import json, pickle

data = {'k1':123, 'k2':'hello'}

## json
# json.dumps 將數據通過特殊的形式轉換為所有程式都識別的字元串
j_str = json.dumps(data)
print(j_str)        #{"k2": "hello", "k1": 123}

# json.loads 讀取json.dumps特殊處理後的數據並返回該對象
j_str_loads = json.loads(j_str)
print(j_str_loads)      #{'k2': 'hello', 'k1': 123}

# json.dump 將數據通過特殊的形式轉換為所有程式都識別的字元串,並寫入文件
with open('file.json', 'w') as fp:
    json.dump(data, fp)

with open('file.json', 'r') as fp:
    data_j_load = json.load(fp)
print(data_j_load)      #{'k2': 'hello', 'k1': 123}


## pickle
# pickle.dumps將數據通過特殊的形式轉換成只有python語言能識別的字元串
p_str = pickle.dumps(data)
print(p_str)       #b'\x80\x03}q\x00(X\x02\x00\x00\x00k2q\x01X\x05\x00\x00\x00helloq\x02X\x02\x00\x00\x00k1q\x03K{u.'

# pickle.loads 讀取pickle.dumps特殊處理後的數據並返回該對象
p_loads = pickle.loads(p_str)
print(p_loads)      #{'k2': 'hello', 'k1': 123}

# pickle.dump將數據通過特殊的形式轉換成只有python語言識別的字元串,並寫入文件
with open('file.pickle', 'wb') as fp:
    pickle.dump(data, fp)

# pickle.loads 從文件中讀取pickle.dumps特殊處理後的數據並返回該對象
with open('file.pickle', 'rb') as fp:
    data_p_load = pickle.load(fp)
print(data_p_load)        #{'k2': 'hello', 'k1': 123}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於這份指南 之前有不少學弟學妹問我如何學習編程,根據DRY法則(Don't Repeat Yourself),還是把自己學習過程中的一些經驗整理成一篇博客吧。由於本人目前也處在學習的階段,文章中列出來的內容也並未全部學習過,所以文章的客觀性可能存在一些問題,還望讀者自行判斷。 這份指南會不定期更新
  • 多少年來,許多的編程語言和工具都包含對正則表達式的支持,.NET基礎類庫中包含有一個名字空間和一系列可以充分發揮規則表達式威力的類,而且它們也都與未來的Perl 5中的規則表達式相容。 此外,regexp類還能夠完成一些其他的功能,例如從右至左的結合模式和表達式的編輯等。 在這篇文章中,我將簡要地介
  • powershell的return使用方法研究,案例詳解。
  • 一.Golang安裝 1.下載golang安裝包http://golangtc.com/download,我這裡下載的是go1.6rc2.linux-amd64.tar.gz。 2.解壓到安裝目錄,我這裡是/usr/local 1 sudo tar -zxf go1.6rc2.linux-amd64
  • c 參照編譯器底層實現一個 json引擎. 這是第一篇 主要講解解析部分. 可能 寫的不流利,主要看代碼吧. 之前寫了一個,後面看了cJSON的實現,簡單 合併重構了一下. 歡迎嘗試吐槽
  • 一直沒做過SSH(Struts2+Spring+Hibernate)的實際項目,只是三個框架學的還熟練,但整合起來使用就不知道了。所以前段時間在網上找了一套SSH實際項目的視頻來學習(確切的說是買的...),一直沒時間來總結,得到的經驗主要是SSH的整合及配置,更多的則是SSH之外的一些經驗,比如代
  • 項目地址:https://github.com/brianlmoon/GearmanManager PHP環境要求 PHP 5.5.9 POSIX extension Process Control extension pecl/gearman or Net_Gearman 使用GearmanMan
  • 原理:php預設擴展庫不含有redis擴展;要支持redis擴展,需要有redis.so這個擴展文件 所以我們的目標就是生成redis.so擴展文件,並修改php.ini 讓其支持redis擴展。 準備測試環境與軟體: Vm虛擬機; CentOS5.5(已搭建好LNMP環境); Redis-2.6.
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...