d16 collections模塊 時間模塊 random模塊 os模塊 sys模塊 序列化模塊 subprocess模塊

 

collections模塊

在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。python

nametype具名元組

具備名字的元組git

座標 :x爲1 y爲2 z爲3shell

from collections import namedtuple
point = namedtuple('座標',['x','y','z'])
#也能夠下面格式
point1 = namedtuple('座標','x, z, y')
# 第二個參數既能夠爲可迭代對象,也能夠是字符串
# 字符串得用空格隔開
p = point(1,2,3)
# 注意元素的個數必須和nametype第二個參數的數量一致
print(p)
print(p.x)
print(p.y)
print(p.z)
View Code

撲克牌json

from collections import namedtuple

card= namedtuple('撲克牌','color,number')
# card= namedtuple('撲克牌',['color,number'])
A = card('','A')
print(A)
print(A.color)
print(A.number)
View Code

城市天氣bash

city  = namedtuple('中國','city,weather,temperature')
c = city('北京','','30')
print(c)
print(c.city)
print(c.weather)
print(c.temperature)
View Code

 

deque雙端隊列

雙端隊列倆端均可以進和出網絡

queue隊列數據結構

隊列:先進先出,  FIFO(first in first out)
import queue
# 生成隊列對象
q = queue.Queue()
# 往隊列添加值
q.put('first')
q.put('second')
q.put('third')

# 向隊列取值,程序會在原地等待,直到從隊列得到值
print(q.get())
print(q.get())
print(q.get())
View Code

deque雙端隊列app

from collections import deque
q = deque(['a','b','c'])
# 添加值
q.append('1')
# 左添加值
q.appendleft('2')
print(q)
# 取值
print(q.pop())
#取左值
#特殊點   能夠根據索引在任意位置插入值
q.insert(2,'哈哈')
q.insert(4,'嘿嘿')
View Code

隊列不該該支持在任意位置插入值,只能在首尾插值dom

語法ide

插入
insert
添加
append
appendleft
取值
pop
popleft
View Code
OrderedDict有序字典

普通字典

normal_d = dict([('a',1),('b',2),('c',3)])
print(normal_d)
normal_d['q'] = 11
normal_d['w'] = 22
print(normal_d)
View Code

有序字典

from collections import OrderedDict
order_d = OrderedDict([('a',1),('b',2),('c',3)])
print(order_d)
order_d1 = OrderedDict()
order_d1['x'] = 11
order_d1['y'] = 22
order_d1['z'] = 33
print(order_d1)
for i in order_d1:
    print(i)
View Code

OrderedDict的Key會按照插入的順序排列,不是Key自己排序

defaultdict 默認字典

通常寫法

value = [11,22,33,44,55,66,77,88,99]

將全部大於 66` `的值保存至字典的第一個'key'中,將小於 66` `的值保存至第二個'key'的值中。
values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = {}

for value in  values:
    if value>66:
        if my_dict.has_key('k1'):
            my_dict['k1'].append(value)
        else:
            my_dict['k1'] = [value]
    else:
        if my_dict.has_key('k2'):
            my_dict['k2'].append(value)
        else:
            my_dict['k2'] = [value]
View Code

使用模塊

from collections import defaultdict

values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = defaultdict(list)  # 後續該字典中新建的key對應的value默認就是列表
print(my_dict['aaa'])
for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
print(my_dict)


my_dict1 = defaultdict(int)
print(my_dict1['xxx'])
print(my_dict1['yyy'])

my_dict2 = defaultdict(bool)
print(my_dict2['kkk'])

my_dict3 = defaultdict(tuple)
print(my_dict3['mmm'])
View Code

使用'dict'時,若是引用的'Key'不存在,就會拋出'KeyError'。若是但願'key'不存在時,返回一個默認值,就能夠用'defaultdict'

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默認值
'N/A'
View Code
counter 計數

Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素做爲key,其計數做爲value。計數值能夠是任意的Interger(包括0和負數)

通常寫法

s = 'asdfghjkhgfdsawssadfghjhhfgdsdsdag'
a = {}
for i in s:
    print(i)
    a[i] = 0
# 在就加1
print(a)
View Code

使用模塊

from collections import Counter
s = 'asdfghjkhgfdsawssadfghjhhfgdsdsdag'
a = {}
res = Counter(s)
print(Counter)
print(res)
# 獲得了v值
for q in res.values():
    print(q)
View Code

時間模塊

表現時間的三種方式
1.時間戳(timestamp)
2.格式化時間(format string)
3.結構化時間(struct_time)
%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 當前時區的名稱
%% %號自己
time模塊
import time
時間戳
time.time()
格式化時間
print(time.strftime('%Y-%m-%d'))
print(time.strftime('%Y-%m-%d %H:%M:%S'))
print(time.strftime('%Y-%m-%d %X'))  
# %X等價於%H:%M:%S
時間元組
localtime將一個時間戳轉換爲當前時區的struct_time
time.localtime()
View Code

時間戳是計算機可以識別的時間;時間字符串是人可以看懂的時間;元組則是用來操做時間的

轉換時間

時間戳-->結構化時間
time.gmtime(時間戳)    
time.localtime(時間戳)

>>>time.gmtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
>>>time.localtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
時間戳-->結構化時間
結構化時間-->時間戳 
time.mktime(結構化時間)
>>>time_tuple = time.localtime(1500000000)
>>>time.mktime(time_tuple)
1500000000.0
結構化時間-->時間戳
結構化時間-->字符串時間
time.strftime("格式定義","結構化時間")  結構化時間參數若不傳,則顯示當前時間
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 14:55:36'
>>>time.strftime("%Y-%m-%d",time.localtime(1500000000))
'2017-07-14'
結構化時間-->字符串時間
字符串時間-->結構化時間
time.strptime(時間字符串,字符串對應格式)
>>>time.strptime("2017-03-16","%Y-%m-%d")
time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
>>>time.strptime("07/24/2017","%m/%d/%Y")
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
字符串時間-->結構化時間

結構化時間 --> %a %b %d %H:%M:%S %Y串
time.asctime(結構化時間) 若是不傳參數,直接返回當前時間的格式化串
>>>time.asctime(time.localtime(1500000000))
'Fri Jul 14 10:40:00 2017'
>>>time.asctime()
'Mon Jul 24 15:18:33 2017'

時間戳 --> %a %b %d %H:%M:%S %Y串
time.ctime(時間戳)  若是不傳參數,直接返回當前時間的格式化串
>>>time.ctime()
'Mon Jul 24 15:19:07 2017'
>>>time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017' 
View Code
datetime模塊
import datetime
print(datetime.date.today())  
# date>>>:年月日
print(datetime.datetime.today())  
# datetime>>>:年月日 時分秒
模塊
import datetime
res = datetime.date.today()
res1 = datetime.datetime.today()
print(res.year)
print(res.month)
print(res.day)
print(res.weekday())  # 0-6表示星期  0表示週一
print(res.isoweekday())  # 1-7表示星期 7就是週日
語法
日期對象 = 日期對象 +/- timedelta對象
timedelta對象 = 日期對象 +/- 日期對象

current_time = datetime.date.today()  # 日期對象
timetel_t = datetime.timedelta(days=7)  # timedelta對象
# +
res1 = current_time+timetel_t  # 日期對象
print(current_time)
print(timetel_t)
print(res1)
# -
print(current_time - timetel_t)
print(res1-current_time)
加減時間

小練習 計算今天距離今年過生日還有多少天

birth = datetime.datetime(2019,12,21,8,8,8)
current_time = datetime.datetime.today()
print(birth-current_time)
練習
# UTC時間
dt_today = datetime.datetime.today()
dt_now = datetime.datetime.now()
dt_utcnow = datetime.datetime.utcnow()
print(dt_utcnow,dt_now,dt_today)
UTC時間

random模塊

import random
整數
random.randint(1,10)
# 隨機取一個數字
random.randrange(1,10,2) 
# 大於等於1且小於10之間的奇數
小數
random.random()
# 隨機取0-1的小數
random.uniform(1,3) 
#大於1小於3的小數
隨機選擇值返回
random.choice([1, 2, 3, 4, 5, 6,7])
# 隨機從列表取值
random.sample([1,'2',[3,4]],9) # #列表元素任意2個組合
語法
res = [1, 2, 3, 4, 5, 6,7]
random.shuffle(res)
print(res)
打亂順序,洗牌

隨機驗證碼

大寫字母 小寫字母 數字

5位數的隨機驗證碼
chr
random.choice
封裝成一個函數,用戶想生成幾位就生成幾位
要求
def get_code(n):
    code = ''
    for i in range(n):
        # 先生成隨機的大寫字母 小寫字母 數字
        upper_str = chr(random.randint(65,90))
        lower_str = chr(random.randint(97,122))
        random_int = str(random.randint(0,9))
        # 從上面三個中隨機選擇一個做爲隨機驗證碼的某一位
        code += random.choice([upper_str,lower_str,random_int])
    return code
res = get_code(4)
print(res)
代碼

os模塊

 os模塊是與操做系統交互的一個接口

 

import os
listdir  會將當前文件夾的文件展現出來
os.mkdir   自動建立文件夾
os.path.exists   判斷文件夾是否存在
os.path.isfile    只能判斷文件是否存在,不能判斷文件夾

remove  刪除文件
os.rmdir     刪除單級目錄,只能刪除空文件夾
os.getcwd()  獲取目錄
os.chdir()  切換當前所在目錄
os.path.getsize()    獲取文件大小  大小單位爲字節
經常使用語法

語法

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的大小
綜合

練習

選擇文件查看

文件夾
火影人物
    鳴人.txt
    向日寧次.txt
    卡卡西.txt
    我愛羅.txt
    大蛇丸.txt
    波佐助.txt
import os
BASE_DIR = os.path.dirname(__file__)
MOVIE_DIR = os.path.join(BASE_DIR,'火影人物')
movie_list = os.listdir(MOVIE_DIR)
while True:
    for i,j in enumerate(movie_list,1):
        print(i,j)
    choice = input('你想看誰的啊(小姑娘/小夥子)>>>:').strip()
    if choice.isdigit():  # 判斷用戶輸入的是不是純數字
        choice = int(choice)  # 傳成int類型
        if choice in range(1,len(movie_list)+1):  # 判斷是否在列表元素個數範圍內
            # 獲取用戶想要看的文件名
            target_file = movie_list[choice-1]
            # 拼接文件絕對路徑
            target_path = os.path.join(MOVIE_DIR,target_file)
            with open(target_path,'r',encoding='utf-8') as f:
                print(f.read())
            else:
            print('所選不在名單中')
    else:
        print('輸入數字哦')
代碼

sys模塊

sys模塊是與python解釋器交互的一個接口

sys.argv           命令行參數List,第一個元素是程序自己路徑
sys.exit(n)        退出程序,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version        獲取Python解釋程序的版本信息
sys.path           返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform       返回操做系統平臺名稱
語法
mport sys
# sys.path.append()  # 將某個路徑添加到系統的環境變量中
# print(sys.platform)
# print(sys.version)  # python解釋器的版本

print(sys.argv)  # 命令行啓動文件 能夠作身份的驗證
if len(sys.argv) <= 1:
    print('請輸入用戶名和密碼')
else:
    username = sys.argv[1]
    password = sys.argv[2]
    if username == 'jason' and password == '123':
        print('歡迎使用')
        # 當前這個py文件邏輯代碼
    else:
        print('用戶不存在 沒法執行當前文件')
例子

序列化模塊

序列化:
 序列:字符串
 序列化:其它數據類型轉換成字符串的過程

寫入文件的數據必須是字符串
基於網絡傳輸的數據必須是二進制

序列化:其餘數據類型轉換成字符穿的過程
反序列化:字符串轉換成其餘數據類型

目的:

一、以某種存儲形式使自定義[對象持久化](https://baike.baidu.com/item/%E5%AF%B9%E8%B1%A1%E6%8C%81%E4%B9%85%E5%8C%96);

二、將對象從一個地方傳遞到另外一個地方。

三、使程序更具維護性。

  

json模塊
    全部的語言都支持json格式
    支持的數據類型不多  字符串 列表 字典 整型 元組(轉成列表)  布爾值

pickle模塊
    只支持python
    python全部的數據類型都支持
    
json,用於字符串 和 python數據類型間進行轉換
pickle,用於python特有的類型 和 python的數據類型間進行轉換
json模塊
json.dumps()
序列化 將其餘數據類型轉換成json格式的字符串
json.dump()
dump方法接收一個文件句柄,直接將字典轉換成json字符串寫入文件
json.loads()
反序列化 將json格式的字符串轉換成其餘數據類型
json.load()
load方法接收一個文件句柄,直接將文件中的json字符串轉換成數據結構返回
注意,json轉換完的字符串類型的字典中的字符串是由""表示的

 

d = {"name":"jason"}
print(d)
#序列化:將一個字典轉換成一個字符串
res = json.dumps(d)  # json格式的字符串 必須是雙引號 >>>: '{"name": "jason"}'
print(res,type(res))

#反序列化:將一個字符串格式的字典轉換成一個字典
res1 = json.loads(res)
print(res1,type(res1))
例子
d = {"name":"jason"}

with open('userinfo','w',encoding='utf-8') as f:
    json.dump(d,f)  # 裝字符串並自動寫入文件
with open('userinfo','r',encoding='utf-8') as f:
    res = json.load(f)
    print(res,type(res))
    
with open('userinfo','r',encoding='utf-8') as f:
    res1 = json.load(f)  # 不可以屢次反序列化
    res2 = json.load(f)
    print(res1,type(res1))
    print(res2,type(res2))
    

with open('userinfo','w',encoding='utf-8') as f:
    json_str = json.dumps(d)
    json_str1 = json.dumps(d)
    #換行寫
    f.write('%s\n'%json_str)
    f.write('%s\n'%json_str1)

#換行讀
with open('userinfo','r',encoding='utf-8') as f:
    for line in f:
        res = json.loads(line)
        print(res,type(res))
t = (1,2,3,4)
print(json.dumps(t))

# fp = 文件句柄(對象)
在源碼中fp =文件句柄(對象) 
練習

ensure_ascii 是否轉碼

有中文時,使用
d1 = {'name':'熊大'}
print(json.dumps(d1,ensure_ascii=False))
View Code
pickle模塊
dumps、dump(序列化,存)、
loads(反序列化,讀)、load  (不只能夠序列化字典,列表...能夠把python中任意的數據類型序列化)

 

import pickle
d = {'name':'jason'}
res = pickle.dumps(d)  # 將對象直接轉成二進制
print(pickle.dumps(d))
res1 = pickle.loads(res)
print(res1,type(res1))
例子
用pickle操做文件的時候 文件的打開模式必須是b模式 
with open('userinfo_1','wb') as f:
    pickle.dump(d,f)

with open('userinfo_1','rb') as f:
    res = pickle.load(f)
    print(res,type(res))
例子

subprucess子進程

 

1.用戶經過網絡鏈接上了你的這臺電腦
2.用戶輸入相應的命令 基於網絡發送給了你這臺電腦上某個程序
3.獲取用戶命令 裏面subprocess執行該用戶命令
4.將執行結果再基於網絡發送給用戶
這樣就實現  用戶遠程操做你這臺電腦的操做
實現
import subprocess
 執行系統指令
import os
# dir 列出全部進程
os.system('dir')


# 打開進程
# shell 命令解釋器
# stdout  標準輸出
# 指定輸出管道
stdout=subprocess.PIPE

a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)

# 從管道中讀取出執行結果
#[1] 輸出
a1=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE )
print(a1.stdout.read().decode('GBK'))

# [2] 輸入
a1=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stdin= subprocess.PIPE)

# PIPE 大寫的單詞爲常量
# PIPE = -1
# STDOUT = -2
# DEVNULL = -3
# [3] 錯誤輸出
print(a1.stderr .read().decode('utf-8'))
# tasklist | findstr python
#  先執行tasklist 把結果交給 findstr 來處理

把p1的輸出傳給p2,
p1 = subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)

p2 = subprocess.Popen('findstr QQ',shell=True,stdin=p1.stdout,stdout=subprocess.PIPE,stderr= subprocess.PIPE )


print(p2.stdout.read())
print(p2.stderr.read())
# 參數1 指令
# p = subprocess.Popen("你的指令或是某個exe",shell=True,stderr=,stdin=,stdout=)

# 2 是不是一個指令
# 3 錯誤輸出管道
# 4 輸入管道
# 5 輸出管道
# # 取出管道中的數據
# p.stderr.read()
# p.stdout.read()
# p.stdin.write(p.stdout.read())#
#  將輸入寫入管道 交給對方進程
語法
相關文章
相關標籤/搜索