1. 程式人生 > >python中常用的模組一

python中常用的模組一

一,常用的模組

模組就是我們將裝有特定功能的程式碼進行歸類,從程式碼編寫的單位來看我們的程式,從小到大的順序:

一條程式碼<語句塊,<程式碼塊(函式,類)<模組我們所寫的所有py檔案都是模組

  引入模組的方式

    1,import 模組

    2,from xxx import 模組

二,collections模組

  collections 模組主要封裝了一些關於集合類的相關操作,比如我們學過的iterable,iterator等等.除了這些以外,collections

還提供了一些除了基本資料型別以外的資料集合型別,Counter,deque,OrderDict,defaultdict以及namedtuple

  1,counter是一個計數器,主要用來計數

  計算一個字串中每個字元出現的次數:

# import collections
from collections import Counter
方法一
s = "I am sylar, I have a dream, freedom...."
dic = {}
for el in s:
    dic[el] = dic.setdefault(el, 0) + 1
print(dic)

方法二
qq = Counter(s)

print("__iter__" in dir(qq))
for item in qq:
    print
(item, qq[item]) #顯示 #{'I': 2, ' ': 7, 'a': 5, 'm': 3, 's': 1, 'y': 1, 'l': 1, 'r': 3, ',': 2, 'h': 1, 'v': 1, 'e': 4, 'd': 2, 'f': 1, 'o': 1, '.': 4} 計算列表中"五花馬"出現的次數 lst = ["五花馬", "千金裘", "不會", "不會", "不會"] c = Counter(lst) print(c['五花馬']) 列印字典中兩個key dic = {"a":"b", "c":"d"} print(dic.keys())

2 deque 雙向佇列

兩種資料結構:1棧,2,佇列

1,棧:FILO.先進後出     2對列:FILO.先進先出

例子棧
from collections import Counter
class Stack:
    def __init__(self, size):
        self.index = 0 #  棧頂指標
        self.lst = []
        self.size = size

    # 給棧新增元素
    def push(self, item):
        if self.index == self.size:
            # 棧已經滿了. 不能再裝東西了
            raise StackFullError('the stack is full')
        self.lst.insert(self.index, item) # 對於空列表. 需要insert插入內容
        # self.lst[self.index] = item # 把元素放到棧裡
        self.index += 1     # 棧頂指標向上移動

    # 從棧中獲取資料
    def pop(self):
        if self.index == 0:
            raise StackEmptyError("the stack is empty")
        self.index -=1 # 指標向下移動
        item = self.lst.pop(self.index) # 獲取元素. 刪除.
        return item
s = Stack(5)
s.push("饅頭1號")
s.push("饅頭2號")
s.push("饅頭3號")
s.push("饅頭4號")
s.push("饅頭5號")

print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
#
#
lst = []
lst.append("哈哈1")
lst.append("哈哈2")
lst.append("哈哈3")
lst.append("哈哈4")

print(lst.pop())
print(lst.pop())
print(lst.pop())
print(lst.pop())

 

佇列例子一
import queue
#
q = queue.Queue() # 建立佇列
q.put("李嘉誠")
q.put("陳冠希")
q.put("周潤發")
q.put("吳彥祖")

print(q.get())
print(q.get())
print(q.get())
print(q.get())
# print(q.get()) # 佇列中如果沒有元素了. 繼續獲取的話. 會阻塞
print("拿完了")

例子二
from collections import deque

q = deque() # 建立一個雙向佇列
q.append("高圓圓")
q.append("江疏影")
q.appendleft("趙又廷")
q.appendleft("劉大哥")
#  劉大哥 趙又廷 高圓圓 江疏影
print(q.pop()) # 從右邊獲取資料
print(q.pop())
print(q.popleft()) # 從左邊獲取資料
print(q.popleft())
print(q.pop())

 

3 namedtuple命名元組 

命名元組,給元組內的元素進行命名,
from collections import namedtuple
# ⾃⼰定義了⼀個元組, 如果靈性夠好, 這其實就是建立了⼀個類
nt = namedtuple("point", ["x", "y"])
p = nt(1, 2)
print(p)
print(p.x)
print(p.y)

4 orderdict和defaultdict

orderdict 顧名思義. 字典的key預設是⽆序的. ⽽OrderedDict是有序的

dic = {'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'}
print(dic)
from collections import OrderedDict
od = OrderedDict({'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'})
print(od)

defaultdict: 可以給字典設定預設值. 當key不存在時. 直接獲取預設值:
from collections import defaultdict
dd = defaultdict(list) # 預設值list
print(dd['娃哈哈']) # [] 當key不存在的時候. 會自動執行構造方法中傳遞的內容. 

 defaultdict

d = defaultdict(list) # {} # 引數位置給的內容必須是可呼叫的
d["周杰倫"] = "昆凌"
print(d["周杰倫"]) # 從字典中獲取資料的時候. 如果這個key不存在. 去執行可執行的內容, 拿到的是一個空列表
例二
lst= [11,22,33,44,55,66,77,88,99]
d = defaultdict(list)
for el in lst:
    if el < 66:
        d["key1"].append(el) # key1預設是不存在的. 但是可以拿key1. 一個空列表.
    else:
        d["key2"].append(el)
print(d)

例三
def func():
    return "胡辣湯"

d = defaultdict(func)

print(d["哈哈"])
print(d)

  

三. 時間模組

時間模組應用於如何計算時間差如何按照客戶的要求展示時間

例如

import time
print(time.time()) # 1538927647.483177 系統時間

 系統時間是上面的一連串的數字,需要對時間進行格式化,那樣就引出了另一種時間格式

在python中時間有三種表現形式

1. 時間戳(timestamp). 時間戳使⽤的是從1970年01月01日 00點00分00秒到現在
一共經過了多少秒... 使用float來表示

獲取當前系統時間, 時間戳
print(time.time()) # 1542166230.6139991, 給機器看的, 以1970-01-01 00:00:00  資料庫儲存的是這個時間
格式化時間    2018-11-14 11:22:56    2018/11/14 11:22:56

  

2. 格式化時間(strftime). 這個時間可以根據我們的需要對時間進行任意的格式化.

import time
s = time.strftime("%Y-%m-%d %H:%M:%S") # 必須記住
print(s)
      日期格式化的標準: 
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m ⽉份(01-12)
%d ⽉內中的⼀天(0-31)
%H 24小時制小時數(0-23)
%I 12進時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期⼀為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%%  %號本身        

  

3. 結構化時間(struct_time). 這個時間主要可以把時間進⾏分類劃分. 比如. 1970
年01月01日 00點00分00秒

# 從時間戳 -> 格式化時間
t = time.localtime(1542513992) # 時區   gmtime() 格林尼治時間.
print(t)
str_time = time.strftime("%Y-%m-%d %H:%M:%S", t)
print(str_time)
#格式化時間 -> 時間戳
#2018-11-18 12:06:32
s = "2018-11-18 12:06:32"
t = time.strptime(s, "%Y-%m-%d %H:%M:%S") #  string parse time
print(t)
# # 結構化時間 -> 時間戳
ss = time.mktime(t)
print(ss)
print(time.strftime("%Y年%m月%d日"))
# 中文
import locale
locale.setlocale(locale.LC_CTYPE, "chinese")
# 用時間戳計算出時間差(秒)
begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S")
end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S")

begin_second = time.mktime(begin_struct_time)
end_second = time.mktime(end_stract_time)

# 秒級的時間差   180000
diff_time_sec = abs(begin_second - end_second)

# 轉換成分鐘
diff_min = int(diff_time_sec//60)
print(diff_min)

diff_hour = diff_min//60  # 1
diff_min_1 = diff_min % 60 # 30

print("時間差是 %s小時%s分鐘" % (diff_hour, diff_min_1))


經典案例
# 用時間戳計算出時間差(秒)
begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S")
end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S")

begin_second = time.mktime(begin_struct_time)
end_second = time.mktime(end_stract_time)

# 秒級的時間差  180000
diff_time_sec = abs(begin_second - end_second)

# 轉化成結構化時間
t = time.gmtime(diff_time_sec) # 最好用格林尼治時間。 否則有時差
print(t)

print("時間差是%s年%s月 %s天 %s小時%s分鐘" % (t.tm_year-1970, t.tm_mon-1, t.tm_mday-1,t.tm_hour, t.tm_min ))

 四隨機數模組random

import random

print(random.randint(1,2))  # [start, end]
print(random.random()) # (0,1)之間的小數
print(random.uniform(3,10)) # (3, 10 )的隨機小數

n = random.randrange(1, 10, 3) # [1, 10) 從奇數中獲取到隨機數

while n != 10:
    n = random.randrange(1, 10, 3)

for i in range(1, 10, 3):#拿出1到10中每三個取一個的值
    print(i)

print(random.choice([1, '周杰倫', ["蓋倫", "胡辣湯"]])) ## 1或者23或者[4,5])
print(random.sample([1, '23', [4, 5]], 2)) # 列表元素任意2個組合

lst = ["周杰倫", "昆凌", "馬化騰", "馬麗", "沈騰", "秋雅"]
random.shuffle(lst)
print(lst)
lst = [1, 2, 3, 4, 5, 6, 7, 8]
random.shuffle(lst) # 隨機打亂順序
print(lst)

五.os模組

所有和作業系統相關的內容都在os模組
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.system("bash command") 運⾏shell命令,直接顯示
os.popen("bash command).read() 運⾏shell命令,獲取執⾏結果
os.getcwd() 獲取當前⼯作⽬錄,即當前python指令碼⼯作的⽬錄路徑
os.chdir("dirname") 改變當前指令碼⼯作⽬錄;相當於shell下cd
# os.path
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的⼤⼩
# 特殊屬性:
os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使⽤的⾏終⽌符,win下為"\r\n",Linux下為"\n"
os.pathsep 輸出⽤於分割⽂件路徑的字串 win下為;,Linux下為:
os.name 輸出字串指示當前使⽤平臺。win->'nt'; Linux->'posix'
 
 os.stat() 屬性解讀:
stat 結構:
st_mode: inode 保護模式
st_ino: inode 節點號。
st_dev: inode 駐留的裝置。
st_nlink: inode 的連結數。
st_uid: 所有者的⽤戶ID。
st_gid: 所有者的組ID。
st_size: 普通⽂件以位元組為單位的⼤⼩;包含等待某些特殊⽂件的資料。
st_atime: 上次訪問的時間。
st_mtime: 最後⼀次修改的時間。
st_ctime: 由作業系統報告的"ctime"。在某些系統上(如Unix)是最新的元資料更改的時間,在
其它系統上(如Windows)是建立時間(詳細資訊參⻅平臺的⽂檔)。

  例子

import os
os.makedirs('dirname1/dirname5') # 建立資料夾目錄結構
os.removedirs('dirname1/dirname5')  # 刪除資料夾, 如果資料夾內沒有東西。 就可以刪除。 否則報錯

os.mkdir('dirname/哈哈')  # mkdir如果父級目錄不存在。 報錯
os.rmdir('dirname') # 刪除資料夾

print(os.listdir('../')) # 獲取到資料夾內的所有內容. 遞迴

print(os.stat('dirname')) # linux

os.system("dir") # 直接執行命令列程式
s = os.popen("dir").read()
print(s)

print(os.getcwd() ) # 當前程式所在的資料夾


print(os.path.abspath("../day020 繼承") ) # 獲取絕對路徑
print(os.path.split("D:\python_workspace\day020 繼承")) # 拆分路徑 ('D:\\python_workspace', 'day020 繼承')
print(os.path.dirname("D:\python_workspace\day020 繼承")) # D:\python_workspace
print(os.path.basename("D:\python_workspace\day020 繼承")) # day020 繼承

print(os.path.exists("dirname")) # 判斷檔案是否存在
print(os.path.isabs("D:\python_workspace\day020 繼承")) # 是否是絕對路徑

print(os.path.isfile("01 今日主要內容")) # 是否是檔案
print(os.path.isdir("dirname")) # 是否是資料夾

print(os.path.getsize("01 今日主要內容") ) # 檔案大小

print("胡辣湯", "傳盛", "big", sep="small")

print("c:"+os.sep+"胡辣湯") # \\/  檔案路徑的分隔符

print(os.name) # nt

六,sys模組

所有和python直譯器相關的都在sys模組

sys.argv   命令列引數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version 獲取Python解釋程式的版本資訊
sys.path    返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform 返回作業系統平臺

 

import sys
sys.exit(1) # 正常退出
print(sys.version)
print(sys.platform) # 平臺名稱

  作業

1、寫一個copy函式,接受兩個引數,第一個引數是原始檔的位置,第二個引數是目標位置,將原始檔copy到目標位置。
import os
def copy(res, target):
    target_dir = os.path.dirname(target)
    if not os.path.exists(target_dir): # 判斷父級目錄是否存在
        os.makedirs(target_dir) # 如果不存在就建立父級目錄
    with open(res, mode="rb") as f1, open(target, mode="wb") as f2:
        for line in f1:
            f2.write(line)

copy("e:/3000soft/hello.txt", "f:/1111111111/fkdsajklf/fdaskfjasd/asdfas/hello.txt")


2、使用random.random()來計算[m,n]以內的隨機整數
(0,1) * 9 (0, 9) + 2  =>   [2, 10]
def func(m,n):
    return int(random.random() * (n-m + 1) + m)

for i in range(100):
    print(func(50,80))
3 寫一個使用者註冊登陸的程式,每一個使用者的註冊都要把使用者名稱和密碼用字典的格式寫入檔案userinfo。
# 在登陸的時候,再從檔案中讀取資訊進行驗證。

def zhuce():
    username = input("please input your username:")
    password = input("please input your password:")
    dic = {"username": username, "password": password}
    f = open("userinfo", mode="a", encoding="utf-8")
    f.write(str(dic)+"\n")
    f.flush()
    f.close()

def denglu():
    username = input("please input your username:")
    password = input("please input your password:")
    f = open("userinfo", mode="r", encoding="utf-8")
    for line in f:
        if line == "":
            continue
        else:
            dic = eval(line.strip())
            if dic['username'] == username and dic['password'] == password:
                print("login successful !")
                return

    else:
        print("login failed!!")


denglu()

4.新建檔案
import os
os.makedirs("glance/api")
os.makedirs("glance/cmd")
os.makedirs("glance/db")

open("glance/__init__.py", mode="w")
open("glance/api/__init__.py", mode="w")
open("glance/cmd/__init__.py", mode="w")
open("glance/db/__init__.py", mode="w")


open("glance/api/policy.py", mode="w")
open("glance/api/version.py", mode="w")

open("glance/cmd/manage.py", mode="w")

open("glance/db/models.py", mode="w")