在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。python
git
shell
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)
撲克牌json
from collections import namedtuple card= namedtuple('撲克牌','color,number') # card= namedtuple('撲克牌',['color,number']) A = card('♥','A') print(A) print(A.color) print(A.number)
城市天氣bash
city = namedtuple('中國','city,weather,temperature') c = city('北京','晴','30') print(c) print(c.city) print(c.weather) print(c.temperature)
網絡
數據結構
隊列:先進先出, 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())
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,'嘿嘿')
隊列不該該支持在任意位置插入值,只能在首尾插值dom
語法ide
插入
insert
添加
append
appendleft
取值
pop
popleft
normal_d = dict([('a',1),('b',2),('c',3)]) print(normal_d) normal_d['q'] = 11 normal_d['w'] = 22 print(normal_d)
有序字典
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)
OrderedDict的Key會按照插入的順序排列,不是Key自己排序
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]
使用模塊
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'])
使用'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'
s = 'asdfghjkhgfdsawssadfghjhhfgdsdsdag' a = {} for i in s: print(i) a[i] = 0 # 在就加1 print(a)
使用模塊
from collections import Counter s = 'asdfghjkhgfdsawssadfghjhhfgdsdsdag' a = {} res = Counter(s) print(Counter) print(res) # 獲得了v值 for q in res.values(): print(q)
表現時間的三種方式 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 當前時區的名稱 %% %號自己
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()
時間戳是計算機可以識別的時間;時間字符串是人可以看懂的時間;元組則是用來操做時間的
轉換時間
時間戳-->結構化時間 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'
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)
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)
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.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.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))
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))
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())# # 將輸入寫入管道 交給對方進程