1. 程式人生 > >巨蟒python全棧開發-第23天 內建常用模組2

巨蟒python全棧開發-第23天 內建常用模組2

一.今日主要內容
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': '史楊楊'}]