1. 程式人生 > >Python基礎(11)_python模塊之time模塊、rando模塊、hashlib、os模塊

Python基礎(11)_python模塊之time模塊、rando模塊、hashlib、os模塊

路徑 固定 val 登錄密碼 rand getcwd ges ble sun

一、模塊

1、什麽是模塊:一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴

  模塊的本質:模塊的本質是一個py文件

2、模塊分為三類:1)內置模塊;2)第三方模塊;3)自定義模塊

3、使用模塊的目的:

  退出python解釋器然後重新進入,那麽你之前定義的函數或者變量都將丟失,因此我們通常將程序寫到文件中以便永久保存下來,需要時就通過python test.py方式去執行,此時test.py被稱為腳本script。

  隨著程序的發展,功能越來越多,為了方便管理,我們通常將程序分成一個個的文件,這樣做程序的結構更清晰,方便管理。這時我們不僅僅可以把這些文件當做腳本去執行,還可以把他們當做模塊來導入到其他的模塊中,實現了功能的重復利用

4、模塊的使用:通過import 調用

示例文件:spam.py,文件名spam.py,模塊名spam

 1 #spam.py
 2 print(from the spam.py)
 3 
 4 money=1000
 5 
 6 def read1():
 7     print(spam->read1->money,money)
 8 
 9 def read2():
10     print(spam->read2 calling read)
11     read1()
12 
13 def change():
14     global money
15     money=0

4.1模塊可以包含可執行的語句和函數的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執行(import語句是可以在程序中的任意位置使用的,且針對同一個模塊很import多次,為了防止你重復導入,python的優化手段是:第一次導入後就將模塊名加載到內存了,後續的import語句僅是對已經加載大內存中的模塊對象增加了一次引用,不會重新執行模塊內的語句),如下

 1 #test.py
 2 import spam #只在第一次導入時才執行spam.py內代碼,此處的顯式效果是只打印一次from the spam.py,當然其他的頂級代碼也都被執行了,只不過沒有顯示效果.
3 import spam 4 import spam 5 import spam 6 7 ‘‘‘ 8 執行結果: 9 from the spam.py 10 ‘‘‘

我們可以從sys.module中找到當前已經加載的模塊,sys.module是一個字典,內部包含模塊名與模塊對象的映射,該字典決定了導入模塊時是否需要重新導入。

4.2 每個模塊都是一個獨立的名稱空間,定義在這個模塊中的函數,把這個模塊的名稱空間當做全局名稱空間,這樣我們在編寫自己的模塊時,就不用擔心我們定義在自己模塊中全局變量會在被導入時,與使用者的全局變量沖突

 1 #測試一:money與spam.money不沖突
 2 #test.py
 3 import spam 
 4 money=10
 5 print(spam.money)
 6 
 7 ‘‘‘
 8 執行結果:
 9 from the spam.py
10 1000
11 ‘‘‘

 1 #測試二:read1與spam.read1不沖突
 2 #test.py
 3 import spam
 4 def read1():
 5     print(========)
 6 spam.read1()
 7 
 8 ‘‘‘
 9 執行結果:
10 from the spam.py
11 spam->read1->money 1000
12 ‘‘‘

 1 #測試三:執行spam.change()操作的全局變量money仍然是spam中的
 2 #test.py
 3 import spam
 4 money=1
 5 spam.change()
 6 print(money)
 7 
 8 ‘‘‘
 9 執行結果:
10 from the spam.py
11 1
12 ‘‘‘

總結:首次導入模塊spam時會做三件事:

  1.為源文件(spam模塊)創建新的名稱空間,在spam中定義的函數和方法若是使用到了global時訪問的就是這個名稱空間。

  2.在新創建的命名空間中執行模塊中包含的代碼,見初始導入import spam

  3.創建名字spam來引用該命名空間

1.#為模塊名起別名,相當於m1=1;m2=m1 
2.import spam as sm
3.print(sm.money)

#在一行導入多個模塊
1.import sys,os,re

二、常用內置模塊

1、time模塊

  1、時間的表示形式    

    在Python中,通常有這三種方式來表示時間:時間戳元組(struct_time)格式化的時間字符串

    (1)時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。

    (2)格式化的時間字符串(Format String): ‘1988-03-16’

    (3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)

 1 # <1> 時間戳
 2 >>> import time
 3 >>> time.time()      #--------------返回當前時間的時間戳
 4 1493136727.099066
 5 
 6 # <2> 時間字符串
 7 >>> time.strftime("%Y-%m-%d %X")
 8 2017-04-26 00:32:18
 9 
10 # <3> 時間元組
11 >>> time.localtime()
12 time.struct_time(tm_year=2017, tm_mon=4, tm_mday=26,
13                  tm_hour=0, tm_min=32, tm_sec=42, tm_wday=2,
14                  tm_yday=116, tm_isdst=0)

    小結:時間戳是計算機能夠識別的時間;時間字符串是人能夠看懂的時間;元組則是用來操作時間的

  2、幾種時間形式的轉換

    (1)

技術分享

 1 # print(time.time())   #  僅僅是當前時間的時間戳     float型
 2 #------------------------------------------------
 3 #print(time.localtime())  #  當前時間的結構化時間對象
 4 
 5 s=time.localtime(312431212)      #  結構化時間對象         將時間戳------->結構化時間
 6 s2=time.gmtime()        #  結構化時間對象   UTC時間
 7 
 8 # print(s.tm_year)
 9 # print(s.tm_wday)
10 #------------------------------------------------
11 t="2012-12-12"
12 ret=time.mktime(time.localtime())  #  將結構化時間------->時間戳
13 print(ret)
14 #------------------------------------------------
15 ret2=time.strftime("%Y-%m-%d",time.localtime())  # 將結構化時間------>字符串時間
16 print(ret2)
17 #------------------------------------------------
18 ret3=time.strptime("1900:03:12","%Y:%m:%d")               # 將字符串時間----->結構化時間
19 print(ret3)

    (2)

技術分享

1 >>> time.asctime(time.localtime(312343423))
2 Sun Nov 25 10:03:43 1979
3 >>> time.ctime(312343423)
4 Sun Nov 25 10:03:43 1979
#--------------------------其他方法
# sleep(secs)
# 線程推遲指定的時間運行,單位為秒。

2、random模塊

  1、random模塊的使用

>>> import random
>>> random.random()      # 大於0且小於1之間的小數
0.7664338663654585

>>> random.randint(1,5)  # 大於等於1且小於等於5之間的整數

>>> random.randrange(1,3) # 大於等於1且小於3之間的整數

>>> random.choice([1,‘23‘,[4,5]])  # #1或者23或者[4,5]

>>> random.sample([1,‘23‘,[4,5]],2) # #列表元素任意2個組合
[[4, 5], ‘23‘]

>>> random.uniform(1,3) #大於1小於3的小數
1.6270147180533838

>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打亂次序
>>> item
[5, 1, 3, 7, 9]

>>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]

  2、random模塊的應用:最近生成五位數的驗證碼

#練習: 隨機生成五位數驗證碼
def valdate_code():
    ret=""
    for i in range(5):
        num=random.randint(0,9)
        alfa=chr(random.randint(97, 122))
        alfa2=chr(random.randint(65, 90))
        s=random.choice([str(num),alfa,alfa2])
        ret=ret+s
    return ret

    # 思路2
    # ret=random.sample([1,2,3,4,5,6,7,8,9,0],5)
    # print(ret)
    # print(type(ret))
    # #
    # ret=‘‘.join(ret)
    # # return ret

print(valdate_code())

3、hashlib

  1、hash:一種摘要算法 ,3.x裏代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

  2、摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)
  三個特點:
    1.內容相同則hash運算結果相同,內容稍微改變則hash值則變
    2.不可逆推
    3.相同算法:無論校驗多長的數據,得到的哈希值長度固定。

  3、以常見的摘要算法MD5為例,計算出一個字符串的MD5值:

import hashlib
 
md5 = hashlib.md5()
md5.update(‘how to use md5 in python hashlib?‘)
print md5.hexdigest()

計算結果如下:
d26a53750bc40b38b65a520292f69306

  如果數據量很大,可以分塊多次調用update(),最後計算的結果是一樣的:

md5 = hashlib.md5()
md5.update(‘how to use md5 in ‘)
md5.update(‘python hashlib?‘)
print md5.hexdigest()

  MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。另一種常見的摘要算法是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,不過越安全的算法越慢,而且摘要長度更長。

  4、摘要算法應用

    4.1網站存儲用戶登錄的用戶名和登錄密碼

username | password
---------+---------------------------------
michael  | e10adc3949ba59abbe56e057f20f883e
bob      | 878ef96e86145580c38c87f0410ad153
alice    | 99b1c2188db85afee403b1536010c2c9

    4.2,防止網站數據泄露後,黑客“撞庫”,對網站存儲用戶登錄的用戶名和登錄密碼進行“加鹽”,即通過對原始口令加一個復雜字符串來實現

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

    經過Salt處理的MD5口令,只要Salt不被黑客知道,即使用戶輸入簡單口令,也很難通過MD5反推明文口令。

4、os模塊

  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    輸出用於分割文件路徑的字符串 win下為;,Linux下為:
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所指向的文件或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小
‘‘‘

 

 1 os路徑處理
 2 #方式一:推薦使用
 3 import os
 4 #具體應用
 5 import os,sys
 6 possible_topdir = os.path.normpath(os.path.join(
 7     os.path.abspath(__file__),
 8     os.pardir, #上一級
 9     os.pardir,
10     os.pardir
11 ))
12 sys.path.insert(0,possible_topdir)
13 
14 
15 #方式二:不推薦使用
16 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

Python基礎(11)_python模塊之time模塊、rando模塊、hashlib、os模塊