巨蟒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)超级重点知识(popen)

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 继承')
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': '史杨杨'}]

 

posted @ 2018-12-27 23:24  studybrother  阅读(225)  评论(0编辑  收藏  举报