巨蟒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)node

import os
os.mkdir(r'donggua\xiaobai') #上層文件夾必須存在,建立一個文件
#注意這個地方必定要添加上r

(3)python

import os
os.removedirs('donggua')    #目錄不是空,不能刪除
os.removedirs('baby/安哥拉/特斯拉/黃曉明')   #安哥拉/特斯拉/黃曉明所有刪除了
#能夠幫咱們刪除當前這個目錄級中的全部空文件夾

(4)linux

#建立能夠多建立,可是刪除不能夠多刪除,
import os
os.rmdir('baby/baobao/donggua/黃曉明')
#一次只能刪除一個'黃曉明'文件

(5)#用法介紹1shell

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 #

#用法介紹2json

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)超級重點知識(popen)bash

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)app

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 繼承')
print(sys.path)
#在文件路徑列表中添加目錄
#跨文件,找路徑能夠考慮這個東西

import master
master.chi()

master.py

def chi():
    print('大神很能吃')
#結果:
['F:\\Python_workspace_S18\\week5\\day23 內置模塊2', 'F:\\Python_workspace_S18', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'G:\\PyCharm 2018.2.3\\helpers\\pycharm_matplotlib_backend']
['F:\\Python_workspace_S18\\week5\\day23 內置模塊2', 'F:\\Python_workspace_S18', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'G:\\PyCharm 2018.2.3\\helpers\\pycharm_matplotlib_backend', 'F:\\Python_workspace_S18\\week5\\day21 繼承']
大神很能吃

 

(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': '史楊楊'}]
相關文章
相關標籤/搜索