Day5- Python基礎5 模塊導入、time、datetime、random、os、sys、hashlib、json&pickle

本節目錄:java

1.模塊的分類python

2.模塊的導入linux

3.time模塊算法

4.datetime模塊shell

5.randomjson

6.os模塊安全

7.sys模塊 bash

8.hashlib數據結構

9.json&pickleapp

1、模塊的分類

Python流行的一個緣由就是由於它的第三方模塊數量巨大,咱們編寫代碼沒必要從零開始從新造輪子,許多要用的功能都已經寫好封裝成庫了,咱們只要直接調用便可,模塊分爲內建模塊、自定義的模塊、安裝的第三方的模塊,通常都放在不一樣的地方,下面來看一下內建模塊怎麼導入,以及他們存放的位置。

import  sys       # 能夠用import 直接導入內建模塊

for i in sys.path:    # sys.path存放有每次導入模塊都會去搜尋的路徑
    print(i)

'''
D:\pycharm2018\S3\s3基礎\day9
D:\pycharm2018\S3                           #自定義模塊放在當前工做空間
F:\BaiduNetdiskDownload\python3.5.2\python35.zip
F:\BaiduNetdiskDownload\python3.5.2\DLLs
F:\BaiduNetdiskDownload\python3.5.2\lib      #內建模塊存放位置
F:\BaiduNetdiskDownload\python3.5.2
F:\BaiduNetdiskDownload\python3.5.2\lib\site-packages   #第三方庫的安裝位置
'''
#能夠向sys.path中用append()的方法導入,例如 sys.path.append('D:')後,在D:目錄下的py文件能夠用import直接導入
print(sys.platform)   # win32  sys.platform能夠獲取當前工做平臺(win32)or linux
#此外 sys.argv能夠獲取腳本的參數,argv[0] 是腳本名,argv[1]是第一個參數...

2.模塊的導入

首先要說明下,本身定義的模塊的名字和內建模塊的名字不要相同,不然的話,導入的時候會出現問題,內建的模塊,和第三方模塊已經存在sys.path的路徑中,因此直接導入便可,下面來講明下本身寫了一個項目,項目中的各個庫是如何導入的,假設我定義了一個modules的項目,下面是其目錄結構看如何在1.py文件導入

上圖左邊是目錄樹,右邊是在1.py文件中如何導入在lib/account.py下定義的函數,列舉了三種經常使用導入方式。

[1]:import屢次爲何只導入一次?

在sys.modules記錄着呢

3.time模塊

time差很少有8,9種的方法,可能不少,可是咱們要記住一個基本的規則是什麼。

時間戳

1:時間戳   就是一個秒數  他是從1970 1月1日0點開始算 到如今一共經歷了多少秒  	1970年他是Unix誕生
>>> time.time()
1520587685.2926712

給咱們的意義就是作計算用的 計算經歷了多長時間,你不用這個time.time 用什麼?

結構化時間

2:結構化時間
time.localtime   本地的時間對象
time.gmtime		utc的時間對象

以英國格林尼治時間化分24個時區,一個時區15°  1°是15分鐘 咱們東八區與utc時間相差8小時

>>> time.localtime()
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=9, tm_hour=17, tm_min=33, tm_se
c=9, tm_wday=4, tm_yday=68, tm_isdst=0)

struct_time裏面的每個值都具備他特殊的意義:
	tm_wday 一週的周幾 週一對應0
	tm_yday 一年的多少天

給咱們的意義就是咱們能夠對這個時間對象,取獲得任意你想要的值。
>>> t = time.localtime()
>>> t.tm_year
2018
>>> t.tm_wday
4

字符串時間   

把時間戳或者結構化時間,變成咱們直觀能夠接受的

import time

#時間戳與結構化時間之間的互換
#時間戳轉成結構化時間
print(time.localtime(123456)) #本地時間 (UCT)
print(time.gmtime(123456))    #標準時間
#結構化時間轉成時間戳,必須傳一個結構化時間的作參數
print(time.mktime(time.localtime()))

#執行結果:
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=18, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=10, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)
1493193977.0

#結構化時間與字符串時間之間的轉換
#結構化時間轉成字符串時間
print(time.strftime('%Y-%m-%d %X',time.localtime()))#time.localtime()不寫默認是當前時間
print(time.strftime('%Y-%m-%d %X',time.localtime(123456)))
#字符串時間轉換成結構化時間
print(time.strptime('2017-4-21','%Y-%m-%d')) #字符串時間轉成結構化時間 能夠先查看下方法

#執行結果:
2017-04-26 16:06:17
1970-01-02 18:17:36
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=21, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=111, tm_isdst=-1)

你要是嫌麻煩,不想本身轉成字符串時間,可使用time.asctime() 或time.ctime()

>>> time.asctime()          ##他的默認參數就是一個結構化時間
'Fri Mar  9 18:07:04 2018' 
>>> time.ctime()            ##他的默認參數是一個時間戳
'Fri Mar  9 18:11:17 2018'
>>> time.ctime(23)          ##在上面的轉化沒有,涉及到時間戳和字符串的轉化,你能夠採用這個
'Thu Jan  1 08:00:23 1970'
>>>                         ##他們的參數不同,可是最後都是字符串

其餘的方法:

time.sleep(1)  #參數秒,睡多少秒 

 

4.datetime模塊  (沒啥好說的)

import  datetime 

print(datetime.datetime.now())  ##這個會比time的asctime 和 ctime 好看多了
##2018-03-09 18:17:39.286773

其餘的一些使用:

import datetime
 
print(datetime.datetime.now())                                         # 2016-05-17 15:46:40.784376  獲取當前的日期和時間
print(datetime.datetime.now()+datetime.timedelta(days=10))             # 2016-05-27 15:47:45.702528  將當前的時間向後推遲10天
print(datetime.date.today())                                           # 2016-05-17  獲取當前的日期
print(datetime.datetime.utcnow())                                      # 2016-05-17 08:23:41.150628  獲取格林威治時間
 
print(datetime.datetime.now().timetuple())                      # time.struct_time(tm_year=2016 ... tm_hour=16,...)獲取當前一個包含當前時間的結構體
print(datetime.datetime.now().timestamp())                      # 1463473711.057878  獲取當前的時間戳
print((datetime.datetime.fromtimestamp(1463473711.057878)))          # 2016-05-17 16:28:31.057878 將時間戳轉換成日期和時間
print(datetime.datetime.strptime('2016-05-17 16:28:31','%Y-%m-%d %H:%M:%S'))  #2016-05-17 16:28:31     str轉換爲datetime
print(datetime.datetime.now().strftime('%D, %m %d %H:%M'))                    #05/23/16, 05 23 10:10  datetime轉換爲str

5.random模塊 

import  random

ret = random.random()   ##隨機輸出 0 -1 之間的浮點數
ret = random.randint(1,3)  ##[1-3]之間隨機輸出 爲整數
ret = random.randrange(1,3) ## 和range(1,3)同樣,顧頭不顧尾
ret = random.choice([11,33,44]) ##從【11,33,44】這三個數字隨機取出一個 各佔百分之33的機率
ret = random.uniform(1,3)   ##隨機隨機從1-3之間的浮點數

item =[1,3,4,5,6]
print(random.shuffle(item),item)
##輸出 None [1, 6, 4, 5, 3]   打亂序列裏面的值,場景,如打撲克牌 打亂排序
print(ret)

練習:4個驗證碼  數字和字母組合

import  random
def v_code():
    ret = ""
    for i  in range(0,5):
        num = random.randint(0,9)  ##隨機0-9
        alf = chr(random.randint(65,122))
        s = str(random.choice([num,alf]))
        ret += s
    return ret

print(v_code())
輸出:
a2049

6.os模塊 

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

7.sys模塊

修改環境變量的兩種:

臨時修改:

import  sys
sys.path.append("d:\\")    ###這裏修改的是臨時的
print(sys.path)
'''
['D:\\pycharm2018\\S3\\s3基礎\\day9',
'D:\\pycharm2018\\S3',
'F:\\BaiduNetdiskDownload\\python3.5.2\\python35.zip',
'F:\\BaiduNetdiskDownload\\python3.5.2\\DLLs',
'F:\\BaiduNetdiskDownload\\python3.5.2\\lib',
'F:\\BaiduNetdiskDownload\\python3.5.2',
'F:\\BaiduNetdiskDownload\\python3.5.2\\lib\\site-packages',
'd:\\']
'''

永久修改:

點擊個人電腦--右鍵屬性--》點擊高級屬性設置--》點擊環境變量--》找到path
將要添加的路徑加入 用英文的; 進行分隔

sys.argv           命令行參數List,第一個元素是程序自己路徑
sys.exit(n)        退出程序,正常退出時exit(0)
sys.version        獲取Python解釋程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform       返回操做系統平臺名稱

練習進度條:

import sys,time
for i in range(10):
    sys.stdout.write('#')
    time.sleep(1)
    sys.stdout.flush()

8.摘要算法:hashlib模塊

  摘要算法又稱哈希算法、散列算法。它經過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(一般用16進制的字符串表示)。

  摘要算法就是經過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是爲了發現原始數據是否被人篡改過。

  摘要算法之因此能指出數據是否被篡改過,就是由於摘要函數是一個單向函數,計算f(data)很容易,但經過digest反推data卻很是困難。並且,對原始數據作一個bit的修改,都會致使計算出的摘要徹底不一樣。

  MD5是最多見的摘要算法,速度很快,生成結果是固定的128 bit字節,一般用一個32位的16進制字符串表示。

  注意:操做的是byte字節數據,若是是字符串str 則須要先轉成字節 byte。

md5()方法
m = hashlib.md5()
m.update('hello'.encode('utf-8')) #字節數據 
print(m.hexdigest()) #16進制的摘要算法結果

import hashlib
#
md5 = hashlib.md5()    #調用md5算法
md5.update(b'hello')   #對字節格式的文件進行摘要算法計算
print(md5.hexdigest()) #打印算法結果 'hello'
#5d41402abc4b2a76b9719d911017c592

md5.update(b'world')   #對字節格式的文件進行摘要算法計算 做用的字節是'helloworld'將上一次的加入到當前文本前
print(md5.hexdigest()) #打印算法結果。
#fc5e038d38a57032085441e7fe7010b0
#假設大文件爲helloworld,最後得出的結果與上邊最後打印的world一致。能夠認爲摘要算法有自動疊加的功能!
import hashlib
md5 = hashlib.md5()    #調用md5算法
md5.update(b'helloworld') #
print(md5.hexdigest())  #打印算法結果  與上邊執行的摘要算法結果一致。
#fc5e038d38a57032085441e7fe7010b0

應用於:文件校驗:大文件分塊校驗,防止文件過大致使的效率問題,最終傳遞的結果同樣。

另外一種常見的摘要算法是SHA1,調用SHA1和調用MD5徹底相似:

import hashlib
 
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in ')
sha1.update('python hashlib?')
print sha1.hexdigest()

 SHA1的結果是160 bit字節,一般用一個40位的16進制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不過越安全的算法越慢,並且摘要長度更長。

注意點:給md5加鹽:

hashlib.md5("salt".encode("utf8"))

9.json & pickle 模塊 

用於序列化的兩個模塊

  • json,用於字符串 和 python數據類型間進行轉換
  • pickle,用於python特有的類型 和 python的數據類型間進行轉換

Json模塊提供了四個功能:dumps、dump、loads、load

pickle模塊提供了四個功能:dumps、dump、loads、load

pickle模塊提供了四個功能:dumps、dump(序列化,存)、loads(反序列化,讀)、load  (不只能夠序列化字典,列表...能夠把python中任意的數據類型序列化

 

注意的是:

這時候機智的你又要說了,既然pickle如此強大,爲何還要學json呢?這裏咱們要說明一下,json是一種全部的語言均可以識別的數據結構。若是咱們將一個字典或者序列化成了一個json存在文件裏,那麼java代碼或者js代碼也能夠拿來用。可是若是咱們用pickle進行序列化,其餘語言就不能讀懂這是什麼了~因此,若是你序列化的內容是列表或者字典,咱們很是推薦你使用json模塊但若是出於某種緣由你不得不序列化其餘的數據類型,而將來你還會用python對這個數據進行反序列化的話,那麼就可使用pickle

相關文章
相關標籤/搜索