day15-Python运维开发基础(json序列化模块、random / time / zipfile / OS模块函数)

1. json序列化模块

# ### json
"""
所有编程语言都能够识别的数据格式叫做json,是字符串

json:  将数据类型序列化成字符串
pickle:将数据类型序列化成字节流

json能够转换的数据类型: 
    int float bool str list tuple dict None
"""
import json
# ### (1) json基本语法
"""dumps 和 loads 是一对,用来序列化和反序列化数据的
ensure_ascii = False : 显示中文
sort_keys = True    :  对字典的键进行排序
"""

# dumps 把任意对象序列化成一个str
dic = {"name":"常远","age":20,"sex":"男性","family":["爸爸","妈妈","妹妹"]}
res = json.dumps(dic,ensure_ascii=False,sort_keys=True)
print(res,type(res))

# loads 把任意str反序列化成原来数据
dic = json.loads(res)
print(dic,type(dic))

"""dump 和 load 是一对,根据文件进行操作存储"""
dic = {"name":"常远","age":20,"sex":"男性","family":["爸爸","妈妈","妹妹"]}
with open("ceshi1.json",mode="w",encoding="utf-8") as fp:
    json.dump(dic,fp,ensure_ascii=False)
    
with open("ceshi1.json",mode="r",encoding="utf-8") as fp:
    dic = json.load(fp)
print(dic , type(dic))


# ### (2)json 和 pickle之间的区别
# json
"""
json可以连续dump , 但是不能连续load
load 是一次性拿出所有数据进行反序列化
"""
dic1 = {"a":1,"b":2}
dic2 = {"c":3,"d":4}
with open("ceshi2.txt",mode="w+",encoding="utf-8") as fp:
    json.dump(dic1,fp)
    fp.write("\n")
    json.dump(dic2,fp)
    fp.write("\n")

# 不能够把两个字典都识别出来
"""
# error
with open("ceshi2.txt",mode="r",encoding="utf-8") as fp:
    res = json.load(fp)
    print(res)
"""

# 文件对象是迭代器
from collections import Iterator
res = isinstance(fp,Iterator)
print(res)

# loads方法来识别出每一个字典
with open("ceshi2.txt",mode="r+",encoding="utf-8") as fp:
    for i in fp:
        # print(i,type(i))
        dic = json.loads(i)
        print(dic ,type(dic) )

# pickle
"""
pickle 可以连续dump , 也可以连续load
pickle在插入数据时,在数据末尾写了结束的标识符,所以可以识别各个数据
"""
import pickle
dic1 = {"a":1,"b":2}
dic2 = {"c":3,"d":4}
with open("ceshi3.pkl",mode="wb") as fp:
    pickle.dump(dic1,fp)
    pickle.dump(dic2,fp)

# 可以连续load
print("<===>")
with open("ceshi3.pkl",mode="rb") as fp:
    """
    dic = pickle.load(fp)
    print(dic,type(dic))
    dic = pickle.load(fp)
    print(dic,type(dic))
    """
    try:
        while True:
            dic = pickle.load(fp)
            print(dic)
    except:
        pass

"""
try .. except ..
try:
    把有问题的代码写到try代码块中
except:
    如果发生了报错,直接执行except这个代码块
"""

"""
# 总结:
# json 和 pickle 两个模块的区别:
(1)json序列化之后的数据类型是str,所有编程语言都识别,
   但是仅限于(int float bool)(str list tuple dict None)
   json不能连续load,只能一次性拿出所有数据
(2)pickle序列化之后的数据类型是bytes,
   所有数据类型都可转化,但仅限于python之间的存储传输.
   pickle可以连续load,多套数据放到同一个文件中
"""
json序列化模块 示例代码

2. random 模块

# ### 随机模块 random
import random
#random() 获取随机0-1之间的小数(左闭右开) 0<= x < 1
res = random.random()
print(res)

#randrange() 随机获取指定范围内的整数(包含开始值,不包含结束值,间隔值)

# 一个参数 0~1
res = random.randrange(2)
print(res)

# 二个参数 1~9
res = random.randrange(1,10)
print(res)

# 三个参数
res = random.randrange(1,10,3) # 1 4 7 
print(res)

#randint()   随机产生指定范围内的随机整数 (了解)
res = random.randint(2,5) # 2 3 4 5
print(res)

#uniform() 获取指定范围内的随机小数(左闭右开)
# 1 <= x < 3
res = random.uniform(1,3)
print(res)

# -2 < x <= 1 参数的大小可以反着写,但不推荐.
res = random.uniform(1,-2)
print(res)
"""
# return a + (b-a) * self.random()
a = 1
b = -2
1 + (-2-1) * (0<= x < 1)  当x=0 => 1
1 + (-2-1) * (0<= x < 1)  当x=1 => -2
-2 < x <= 1
"""

#choice()  随机获取序列中的值(多选一)
lst = ["李德亮","林明辉","林荫站"]
res = random.choice(lst)
print(res)

# 自定义choice
lst = ["李德亮","林明辉","林荫站"]
def mychoice(lst):
    num = len(lst) # 3
    rand_num = random.randrange(num) # 0 1 2
    return lst[rand_num]
print( mychoice(lst) )

#sample()  随机获取序列中的值(多选多) [返回列表]
lst = ["李德亮","林明辉","林荫站","王文","周杰伦","郭富城"]
res = random.sample(lst,2)
print(res)

#shuffle() 随机打乱序列中的值(直接打乱原序列)
lst = [ 1,2,3,4]
res = random.shuffle(lst)
print(res) # None 返回值没有意义
print(lst)
# 小案例:随机验证码
"""
# a -> 97  z->122
# A -> 65  Z->90

# print( ord("a"))
# print( chr(97) )
"""
def func():
    strvar = ""
    # 循环四次
    for i in range(4):
        #a~z
        sm_char = chr(random.randrange(97,123))
        #A-Z
        bg_char = chr(random.randrange(65,91))
        #0~9
        num = str(random.randrange(10))
        #把可能的字符元素塞到列表
        lst = [sm_char,bg_char,num]
        #通过choice抽取其中的元素
        strvar += random.choice(lst)
    # 返回最后的字符串
    return strvar
res = func()
print(res)
random模块函数 示例代码

3. time 模块

# ### 时间模块 time
import time
#time()      获取本地时间戳 (时间戳 : 秒数)
res = time.time()
print(res) 

#mktime()        通过[时间元组]获取[时间戳] (参数是时间元组)
ttp = (2019,10,28,11,28,30,0,0,0)
res = time.mktime(ttp)
print(res)

#localtime()     通过[时间戳]获取[时间元组] (默认当前时间)
res = time.localtime() # 默认当前时间
print(res)

res = time.localtime(1572233310)
print(res)

#ctime()         通过[时间戳]获取[时间字符串] (默认当前时间)
res = time.ctime(1572233310)
print(res)

res = time.ctime()
print(res)

#asctime()       通过[时间元组]获取[时间字符串](参数是时间元组) (了解)
ttp = (2019,10,28,11,34,30,1,0,0)
res = time.asctime(ttp)
print(res)

# 优化版 (推荐)
ttp = (2019,10,28,11,34,30,0,0,0)
res = time.mktime(ttp)
time_str = time.ctime(res)
print(time_str)

#strftime()      通过[时间元组]格式化[时间字符串]  (格式化字符串,[可选时间元组参数])
ttp = (1955,10,28,11,39,10,0,0,0)
# strftime 在linux系统中支持中文,windows不支持
res = time.strftime("%Y-%m-%d %H:%M:%S 比尔盖茨,世界首富生日") # (默认以当前时间进行转换)
print(res)

res = time.strftime("%Y-%m-%d %H:%M:%S 比尔盖茨,世界首富生日",ttp)
print(res)

#strptime()      通过[时间字符串]提取出[时间元组]  (时间字符串,格式化字符串)
strvar = "1955-10-28 11:39:10 比尔盖茨,世界首富生日"
strvar2 = "%Y-%m-%d %H:%M:%S 比尔盖茨,世界首富生日"
res = time.strptime(strvar,strvar2)
print(res)

#sleep()         程序睡眠等待
"""
time.sleep(2)
print("睡醒了")
"""
#perf_counter()  用于计算程序运行的时间 (了解)
startime = time.perf_counter()
for i in range(10000000):
    pass
endtime = time.perf_counter()
res = endtime - startime
print(res)

startime = time.time()
for i in range(10000000):
    pass
endtime = time.time()
res = endtime - startime
print(res)
time 模块函数 示例代码

 4. zipfile 压缩模块

# ### zipfile 压缩模块 (zip)
import zipfile

# (1) 压缩文件
# 打开文件
zf = zipfile.ZipFile("ceshi1.zip","w",zipfile.ZIP_DEFLATED)
# 写入内容 write(路径,别名)
zf.write("/bin/bzmore","bzmore")
zf.write("/bin/cat","cat")
# 创建一个临时文件 叫tmp , 在tmp文件夹中放入chacl文件
zf.write("/bin/chacl","tmp/chacl")
# 关闭文件
zf.close()

# (2) 解压文件
# 打开文件
zf = zipfile.ZipFile("ceshi1.zip","r")
# 解压单个文件 extract(文件名,路径)
# zf.extract("bzmore","ceshi1")
# 解压所有文件
zf.extractall("ceshi2")
# 关闭文件
zf.close()

# (3) 追加文件 [支持with语法]
with zipfile.ZipFile("ceshi1.zip","a",zipfile.ZIP_DEFLATED) as zf:
    zf.write("/bin/chmod","chmod")

# (4) 查看压缩包中的内容 namelist
with zipfile.ZipFile("ceshi1.zip","r") as zf:
    lst = zf.namelist()
    print(lst)
zipfile 压缩模块 示例代码

5. os模块 -系统进行操作

 

# ### os模块 -系统进行操作
import os
# os.system("touch ceshi1028.txt")
# os.system("rm -rf ceshi1028.txt")
# os.system("ipconfig")

#popen()   执行系统命令返回对象,通过read方法读出字符串
"""优点:在输入字符串时,可以优先转换成utf-8编码集"""
# obj = os.popen("ipconfig")
obj = os.popen("ifconfig")
print(obj)
res = obj.read()
print(res)

#listdir() 获取指定文件夹中所有内容的名称列表
lst = os.listdir("/home/wangwen")
print(lst)

#getcwd()  获取当前文件所在的默认路径
res = os.getcwd()
print(res) # /mnt/hgfs/gongxiang8/day15

# __file__ 路径 + 文件名
print(__file__)

#chdir()   修改当前文件工作的默认路径
"""
os.chdir("/home/wangwen/mywork")
os.system("mkdir ceshi100")
"""
#environ   获取或修改环境变量
print( os.environ )
print( os.environ["PATH"] )
os.environ["PATH"] += ":/home/wangwen/mywork"

"""
environ(
{'PATH': 
'/root/PycharmProjects/untitled/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin', 'XAUTHORITY': '/home/wangwen/.Xauthority', 'TERM': 'xterm-256color', 'LANG': 'zh_CN.UTF-8', 'PS1': '(venv) ', 'SUDO_USER': 'wangwen', 'DISPLAY': ':0', 'SUDO_GID': '1000', 'MAIL': '/var/mail/root', 'USERNAME': 'root', 'LOGNAME': 'root', 'PWD': '/mnt/hgfs/gongxiang8/day15', 'SUDO_UID': '1000', 'PYCHARM_HOSTED': '1', 'PYCHARM_DISPLAY_PORT': '36249', 'LANGUAGE': 'zh_CN:zh', 'PYTHONPATH': '/root/PycharmProjects/untitled:/home/wangwen/mysoft/pycharm-2019.1.2/helpers/pycharm_matplotlib_backend:/home/wangwen/mysoft/pycharm-2019.1.2/helpers/pycharm_display',
 'SHELL': '/bin/bash', 'PYTHONIOENCODING': 'UTF-8', 'OLDPWD': '/home/wangwen/mysoft/pycharm-2019.1.2/bin', 'USER': 'root', 'SUDO_COMMAND': './pycharm.sh', 'VIRTUAL_ENV': '/root/PycharmProjects/untitled/venv', 'PYTHONUNBUFFERED': '1', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:', 'HOME': '/home/wangwen'})
"""

"""
[linux] 通过python操作linux里面的脚本,要把脚本的路径添加到环境变量path路径中
    (1) 在/home/wangwen/mywork  创建文件abc.sh
    (2) 在abc.sh里 写入ifconfig这个命令
    (3) 修改abc.sh权限,改成777
    (4) os.environ["PATH"] += ":/home/wangwen/mywork" 把脚本对应的路径添加到环境变量中
    (5) python system这个命令执行 abc.sh 这个脚本

[windows] cmd中通过命令调出qq窗口
    (1) 找到该文件的路径,右键属性找路径
    (2) 右键我的电脑属性->高级系统设置->系统变量Path->新建把刚才的路径黏贴上去
    (3) cmd -> QQScLauncher.exe
"""

os.system("abc.sh")

#--os 模块属性

#name 获取系统标识   linux,mac ->posix      windows -> nt
print(os.name)

#sep 获取路径分割符号  linux,mac -> /       window-> \
print( os.sep )

#linesep 获取系统的换行符号  linux,mac -> \n   window->\r\n 或 \n
print( os.linesep )
print( repr(os.linesep) )
OS模块函数 示例代码

day15

猜你喜欢

转载自www.cnblogs.com/reachos/p/12150600.html