巨蟒python全棧開發-第23天 內建常用模組2
阿新 • • 發佈:2018-12-28
一.今日主要內容
1.nametuple:(命名元組,本質還是元組)
命名元組=>類似建立了一個類
結構化時間其實是個命名元組
2.os
主要是針對作業系統的
一般用來操作檔案系統
os.makedirs() 可以一次性建立多級目錄
os.rmdir() 刪除一個資料夾
os.path.dirname() 獲取資料夾
3.sys(後邊學習包和模組的基礎)
主要針對的是我們的python直譯器
sys.path(重點中的重點)
4.序列化
把一個物件拍散 叫序列化
把拍散的內容整合回物件,反序列化
(1)pickle(重點//把大象拍散)
把一個物件進行序列化操作
1.dumps() 把物件序列化成位元組
2.loads() 把位元組反序列化成物件
3.dump() 把物件序列化寫入檔案
4.load() 把檔案中的內容反序列化成物件
(2)json(重點中的重點)就是一種資料格式,不是一門技術.(在python中,就是一種模組)
#json和pickle操作是一樣,但是資料的格式化是不同的
json你可以認為是python中的字典,有一點點的不一樣
區別:
python:True,False,None
json:true,false,null
1.dumps() 把物件序列化成json
2.loads() 把json反序列化成物件
3.dump() 把物件序列化寫入檔案
4.load() 把檔案中的內容反序列化成物件
二.今日內容大綱
1.命名元組
2.os模組
3.sys模組
4.pickle模組
5.json模組
三.今日內容詳解
1.命名元組(namedtuple)
(1)
from collections import namedtuple #類 p=namedtuple('Point',['x','y']) #物件 '''#等價於下面 # class Point: # def __init__(self,x,y): # self.x=x # self.y=y ''' p1=p(10,20) print(p1) print(p1.x) print(p1.y) #在這裡我們把Point看作是類,p看作是物件''' 結果: Point(x=10, y=20) 10 20 '''
(2)
from collections import namedtuple car=namedtuple('Car',['chepai','color','pailiang']) c=car('京C-10000','綠色','1.8T') print(c) # 結果:Car(chepai='京C-10000', color='綠色', pailiang='1.8T') import time print(time.localtime()) #結果:time.struct_time(tm_year=2018, tm_mon=12, tm_mday=27, tm_hour=20,# tm_min=16, tm_sec=11, tm_wday=3, tm_yday=361, tm_isdst=0) #結構化時間其實是個命名元組
2.os模組
(1)
import os #可以一次性建立多級目錄 # 直接幫助建立 //必須要記住.很常用 os.makedirs('baby/baobao/donggua/黃曉明') #可以一次性建立多級目錄 # 下面程式碼行在執行時必須註釋掉上邊的那行程式碼 os.makedirs('baby/安哥拉/特斯拉/黃曉明') #可以一次性建立多級目錄
(2)
import os os.mkdir(r'donggua\xiaobai') #上層資料夾必須存在,建立一個檔案 #注意這個地方一定要新增上r
(3)
import os os.removedirs('donggua') #目錄不是空,不能刪除 os.removedirs('baby/安哥拉/特斯拉/黃曉明') #安哥拉/特斯拉/黃曉明全部刪除了 #可以幫我們刪除當前這個目錄級中的所有空資料夾
(4)
#建立可以多建立,但是刪除不可以多刪除, import os os.rmdir('baby/baobao/donggua/黃曉明') #一次只能刪除一個'黃曉明'檔案
(5)#用法介紹1
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 #
#用法介紹2
stat()屬性解讀(linux系統用的比較多,用到的時候再說) 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)是建立時間(詳細資訊參見平臺的文件)。
(6)
#檢視當前資料夾內所有的內容 import os os.system('dir') #運⾏shell命令,直接顯示 #注意,上面這條命令,會顯示一些看不懂的字元
(7)
import os print(os.popen('dir')) #結果:<os._wrap_close object at 0x00000195BF1475C0> print(os.popen('dir').read()) #運⾏shell命令,獲取執行結果 #顯示正常的當前目錄 #後期學習到運維的時候會用到,伺服器之間的連結等等,然後敲命令 ''' #上邊第二條語句執行的結果: 驅動器 F 中的卷是 新加捲 卷的序列號是 DC0A-B9CD F:\Python_workspace_S18\week5\day23 內建模組2 的目錄 2018-12-27 20:49 <DIR> . 2018-12-27 20:49 <DIR> .. 2018-12-27 20:18 3,263 01 今日內容大綱 2018-12-27 20:05 3,859 02 作業講解.py 2018-12-27 20:17 863 03 命名元組.py 2018-12-27 20:49 3,296 04 os模組.py 2018-12-27 12:43 783 05 pickle模組.py 2018-12-27 12:53 77 06 json模組.py 2018-12-27 20:33 <DIR> baby 2018-12-27 20:29 <DIR> donggua 2018-12-27 17:42 931 test.py 2018-12-27 19:57 90 userinfo 2018-12-27 15:23 1,145 今日作業.py 2018-12-27 12:53 296 汪峰.xml 10 個檔案 14,603 位元組 4 個目錄 151,124,221,952 可用位元組 '''
(8)
#getcwd() 獲取當前工作目錄 import os print(os.getcwd()) #結果:F:\Python_workspace_S18\week5\day23 內建模組2 #也就是當前工作資料夾的絕對路徑
(9)
import os os.chdir('baby') #chdir()代表更換當前的工作目錄 print(os.getcwd()) #F:\Python_workspace_S18\week5\day23 內建模組2\baby #目錄發生了改變 f=open('userinfo',mode='r',encoding='utf-8') #這樣就不能正常工作了 for line in f: print(line) f=open('../userinfo',mode='r',encoding='utf-8') #回到上一層目錄,這樣就可以正常工作了 for line in f: print(line)
(10)
#用法介紹3
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'
(11)
#os.path 和路徑相關的內容 import os print(os.path.abspath('userinfo')) #把相對路徑改寫成絕對路徑
(12)
# 將path分割成目錄和檔名,2元素以元組返回 import os print(os.path.abspath('userinfo')) #把相對路徑改成絕對路徑 #結果:F:\Python_workspace_S18\week5\day23 內建模組2\userinfo print(os.path.split(r'F:\Python_workspace_S18\week5\day23 內建模組2\baby')) #結果:('F:\\Python_workspace_S18\\week5\\day23 內建模組2', 'baby') print(os.path.dirname(r'F:\Python_workspace_S18\week5\day23 內建模組2\baby')) #結果:F:\Python_workspace_S18\week5\day23 內建模組2 print(os.path.basename(r'F:\Python_workspace_S18\week5\day23 內建模組2\baby')) #結果: baby
整合結果: F:\Python_workspace_S18\week5\day23 內建模組2\userinfo ('F:\\Python_workspace_S18\\week5\\day23 內建模組2', 'baby') F:\Python_workspace_S18\week5\day23 內建模組2 baby
(13)
#exists 判斷是否存在 (返回結果是False&true) import os print(os.path.exists(r'F:\Python_workspace_S18\week5\day23 內建模組2\baby')) #結果:True
3.sys模組
(1)
# \r 回車 \n 換行
#sys模組 #因為變數上邊寫的是win32 import sys print(sys.platform) #結果:win32
(2)
#模組部分的重點,也就是path的問題python #返回模組的搜尋路徑 import sys print(sys.path) #找模組.必須要記住,模組的搜尋路徑 sys.path.append('F:\Python_workspace_S18\week5\day21 繼承') #在檔案路徑列表中新增目錄 #跨檔案,找路徑可以考慮這個東西 import master master.chi()
master.py
def chi(): print('大神很能吃')
(3)
sys.path.clear() #這句話一定不能寫
4.pickle模組
(1)
import pickle class Elephant: def __init__(self,name,weight,height): self.name=name self.weight=weight self.height=height def tiaoxi(self): print(f"{self.name}大象特別喜歡調戲人") e=Elephant('寶寶','1.85T','175') e.tiaoxi() #序列化 bs=pickle.dumps(e) #把物件進行序列化 print(bs) Bs=b'\x80\x03c__main__\nElephant\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\xae\x9d\xe5\xae\x9dq\x04X\x06\x00\x00\x00weightq\x05X\x04\x00\x00\x00185Tq\x06X\x06\x00\x00\x00heightq\x07X\x03\x00\x00\x00175q\x08ub.' #反序列化 dx=pickle.loads(bs) #反序列化,得到的是大象 dx.tiaoxi() dx=pickle.loads(Bs) dx.tiaoxi() #xml解析比較麻煩
(2)
import pickle class Elephant: def __init__(self,name,weight,height): self.name=name self.weight=weight self.height=height def tiaoxi(self): print(f"{self.name}大象特別喜歡調戲人") # (1-1)#第一步:寫 # e1=Elephant('寶寶','1.85T','175') # e2=Elephant('寶貝','1.20T','120') # f=open('大象',mode='wb') # #下面也是序列化 # pickle.dump(e1,f) #123 沒有s(dumps)的這個方法是把物件打散寫入到檔案 # pickle.dump(e2,f) #123 沒有s(dumps)的這個方法是把物件打散寫入到檔案 #寫入檔案的內容,我們是看不懂的//序列化的內容不是給人看的 #前一個引數是物件,後一個引數是檔案控制代碼 #注意,如果兩個都想寫入的話,需要都要開啟 (1-2)#第二步:讀 # f=open('大象',mode='rb') # obj1=pickle.load(f) # obj2=pickle.load(f) # obj1.tiaoxi() # obj2.tiaoxi() (1-3) #存的時候沒有問題,讀的時候就有問題了 #排除讀完檔案的異常 # f=open('大象',mode='rb') # while 1: # try: # obj=pickle.load(f) # obj.tiaoxi() # except Exception: # break (2-1) #將物件放入列表中, e1=Elephant('寶寶','1.85T','175') e2=Elephant('寶貝','1.20T','120') lst=[e1,e2] #寫 pickle.dump(lst,open('大象',mode='wb')) #讀 lst=pickle.load(open('大象',mode='rb')) for dx in lst: dx.tiaoxi()
5.json模組
(1)
import json dic = {"baby":None, "hxm":False, "syy":"小白楊"} s = json.dumps(dic) # json處理中文的問題 print(s) #結果:{"baby": null, "hxm": false, "syy": "\u5c0f\u767d\u6768"}
(2)
import json dic = {"baby":None, "hxm":False, "syy":"小白楊"} s = json.dumps(dic, ensure_ascii=False) # json處理中文的問題 # s = json.dumps(dic, ensure_ascii=False).encode('utf-8') #在這裡我們轉換成位元組就樂意傳輸資料了 print(s) #成功的解決了中文問題 print(type(s)) #注意這個轉換的是字串 #結果:{"baby": null, "hxm": false, "syy": "小白楊"} #<class 'str'>
(3)
import json d = json.loads('{"baby": null, "hxm": false, "syy": "史楊楊"}') print(d) #結果;{'baby': None, 'hxm': False, 'syy': '史楊楊'} print(type(d)) #結果:<class 'dict'> print(d['baby'])#結果:None #因為這是json裡的資料
(4)
#一個json檔案一般放一個物件 #如果非要放多個,通過列表的形式,存放資料,注意這個資料中間必須有逗號進行間隔 import json f=open('baby.json',mode='w',encoding='utf-8') # json.dump({"baby":None, "hxm":False, "syy":"史楊楊"}, f) #寫入檔案的結果:{"baby": null, "hxm": false, "syy": "\u53f2\u6768\u6768"} json.dump({"baby":None, "hxm":False, "syy":"史楊楊"}, f, ensure_ascii=False) # #寫入檔案的結果:{"baby": null, "hxm": false, "syy": "史楊楊"}
(5)#讀出結果
import json f = open("baby.json", mode="r", encoding="utf-8") obj = json.load(f) print(obj) 結果:[{'baby': None, 'hxm': False, 'syy': '史楊楊'}, {'baby': None, 'hxm': False, 'syy': '史楊楊'}]