Python基础23_os,sys,序列化,pickle,json

 一. os 模块 所有关于操作系统的内容都在os模块
    os.makedirs("d:/1PY/新建文件夹/宝宝")      # 可生成多层递归目录
    os.removedirs("d:/1PY/新建文件夹/宝宝")     # 若目录为空, 则删除, 并递归到上一级目录, 如若也为空, 则删除, 依次类推
    os.mkdir("d:/1PY/新建文件夹")      # 生成单级目录, 相当于shell中mkdir dirname
    os.rmdir("d:/1PY/新建文件夹")      # 删除单级空目录, 若目录不为空则无法删除, 报错, 相当于shell中的rmdir dirname
    lst = os.listdir("d:/")        # 列出指定目录下的所有文件和子目录, 包括隐藏文件, 并以列表方式打印
    "d:" 当前文件所在文件夹下    "d:/"  d盘
    print(lst)
    os.remove("")     # 指定删除一个文件
    os.rename("d:/1PY/周末大作业", "d:/1PY/周末作业")       # 重命名文件, 目录
    ret = os.stat("d:/1PY/周末作业")       # 获取文件/目录信息
    print(ret)
    os.stat_result(st_mode=16895, st_ino=1688849860285352, st_dev=399180, st_nlink=1, st_uid=0, st_gid=0,
                   st_size=4096, st_atime=1545896396, st_mtime=1545540100, st_ctime=1543629480)
    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)是创建时间(详细信息参见平台的文档)。
    
    os.system("dir")     # 运行shell命令, 直接显示
    print(os.popen("dir").read())       # pipe open 运行shell命令, 获取执行结果
    ret = os.getcwd()     # current working directory 获取当前工作目录, 即当前python脚本工作的目录路径
    print(ret)
    os.chdir("d:/1PY/周末作业")      # 改变当前脚本工作目录, 相当于 shell下 cd
    ret = os.getcwd()
    print(ret)
    
    os.path
    
    ret = os.path.abspath("d:/1PY/Day20/x1.txt")       # absolute path 返回path规范化的绝对路径
    print(ret)
    ret = os.path.split("d:/1PY/周末作业")        # 将path分割成目录和文件名二元组返回
    print(ret)
    ('d:/1PY', '周末作业')
    print(os.path.dirname("d:/1PY/周末作业"))       # 返回path的目录, 其实就是os.path.split(path)的第一个元素
    d:/1PY
    print(os.path.dirname(__file__))                   # 当前文件的文件夹
    print(os.path.dirname(os.path.dirname(__file__)))   # 当前文件的文件夹的文件夹
    os.path.basename("d:/1PY/周末作业")     # 返回path最后的文件名, 如果path以/或结尾, n那么就会返回空值, 即os.path.split(path)的第二个元素
    print(os.path.exists("d:/1PY/周末大作业"))        # 如果path存在, 返回True, 如果path不存在, 返回False
    os.path.isabs("path")       # 如果path是绝对路径, 返回True
    os.path.isfile("")      # 如果path是一个存在的文件, 返回True, 否则返回False
    os.path.isdir("")       # 如果path是一个存在的目录, 则返回True
    os.path.join(path[, path2[, ...]])        # 将多个路径组合后返回, 第一个绝对路径之前的参数将被忽略
    print(os.path.join("d:/2PY", "Day23"))
    d:/2PY/Day23
    print(os.path.getatime("d:/2PY/Day23 模块_02"))      # 返回path指向的文件或目录的最后访问时间
    print(os.path.getmtime("d:/2PY/Day23 模块_02"))      # 返回path指向的文件或目录的最后修改时间
    print(os.path.getsize("d:/2PY/Day22 模块_01"))       # 返回path的大小
    1545899709.7857668
    1545894003.6891558
    0
    
    特殊属性
    print(os.sep)     # 输出操作系统特定的路径分隔符, win下为"\", linux下为"/"
    print(os.linesep)       # 输出当前平台使用的行终止符  win下为" ", linux下为" "
    print(os.pathsep)       # 输出用于分割文件路径的字符串  win下为";", linux下为":"
    print(os.name)      # 输出字符串指示当前使用平台  win下为"nt", linux下为"posix"

二. sys模块 所有关于python解释器相关的都在sys模块
    print(sys.argv)     # 命令行参数list, 第一个元素时程序本身路径
    ['D:/1PY/Day23/Day23_练习.py']
    sys.exit(0)         # 退出程序, 正常退出是exit(0), 错误退出sys.exit(1)
    print(sys.version)      # 获取python解释程序的版本信息
    3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 12:45:02) [MSC v.1900 32 bit (Intel)]
    
    重要
    print(sys.path)     # 返回模块的搜索路径, 初始化时使用pythonpath环境变量的值
    ['D:\1PY\Day23', 'D:\1PY', 'D:\python\python36.zip', 'D:\python\DLLs',
    'D:\python\lib', 'D:\python','D:\python\lib\site-packages',
    'D:\pycharm\PyCharm 2018.2.4\helpers\pycharm_matplotlib_backend']
    sys.path.append("D:/2PY")
    print(sys.path)
    ['D:\1PY\Day23', 'D:\1PY', 'D:\python\python36.zip', 'D:\python\DLLs',
     'D:\python\lib', 'D:\python', 'D:\python\lib\site-packages',
     'D:\pycharm\PyCharm 2018.2.4\helpers\pycharm_matplotlib_backend', 'D:/2PY']
    
    print(sys.platform)       # 返回操作系统平台名称
    win32
三. 序列化
    序列化就是把内存里的数据类型转变为字符串, 以使其能存储到硬盘或通过网络传输到远程, 因为硬盘或网络传输时只能接受bytes
    python中存在三种序列化的方案:
    1. pickle: 可以将python中的任意数据类型转化成bytes并写入到文件中, 同样也可以吧文件中写好的bytes转换回我们python的数据, 这个过程被称为反序列化
    2. shelve: 简单另类的一种序列化方案, 有点类似后面我们学到的redis, 可以作为一种小型的数据库使用
    3. json:将python中常见的字典, 列表转换成字符串, 是目前前后端数据交互使用频率最高的一种数据格式
四. pickle
    1. dumps()    把对象序列化成字节
    2. loads()    把字节反序列化成对象
    import pickle

    class Cat():
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def catchMouse(self):
            print(self.name, "抓老鼠")

    c = Cat("jerry", 18)
    
    bs = pickle.dumps(c)        # 把对象序列化
    print(bs)                   # 二进制格式
    
    cc = pickle.loads(bs)           # 把二进制反序列化成对象
    cc.catchMouse()
    # jerry 抓老鼠
    
    3. dump()    把对象序列化写入文件
    4. load()    把文件中的内容反序列化成对象
    with open("cat", mode = "wb") as f:
        pickle.dump(c, f)

    with open("cat", mode = "rb") as f:
        cc = pickle.load(f)
        cc.catchMouse()
    # jerry 抓老鼠
    pickle还支持多个对象的导入
    lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)]
    with open("catt", mode = "wb") as f:
        for el in lst:
            pickle.dump(el, f)          # 把对象写入到文件中
    
    with open("catt", mode = "rb") as f:
        for i in range(len(lst)):
            cc = pickle.load(f)            # 从文件中读取对象
            cc.catchMouse()
    上面的写法不太好, 因为在读的时候, 并不知道有多少对象要读,
    最好是把要写的多对象装入一个列表里
    with open("cattt", mode = "wb") as f:
        pickle.dump(lst, f)
    
    with open("cattt", mode = "rb") as f:
        lst = pickle.load(f)
    for el in lst:
        el.catchMouse()
五. json  https://www.cnblogs.com/loleina/p/5623968.html
    全称: javascript object notation jr对象简谱, 是一种轻量级的数据交换格式。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式
    javascript中的json类似python中的字典
    python: True, False, None
    json: true, false, null
    我们的程序时python写的, 但是前端是在JS那边解析json的, 所以, 我们需要把程序产生的字典转化成json格式的json串, 字符串
    1.dumps()    把对象序列化成json
    2.loads()    把json反序列化成对象
    dic = {"a": "女王", "b": "萝莉", "c": "小清新"}
    s = json.dumps(dic, ensure_ascii=False)     # 把字典转化成字符串

  # ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似uXXXX的显示数据,设置成False后,就能正常显示

    print(s)
    {'a': '女王', 'b': '萝莉', 'c': '小清新'}
    dic = json.loads(s)
    print(type(dic), dic)
    <class 'dict'> {'a': '女王', 'b': '萝莉', 'c': '小清新'}
    3.dump()    把对象序列化写入文件
    4.load()    把文件中的内容反序列化成对象
    lst = [{"a": 1}, {"b": 2}, {"c": 3}]
    # 写入
    with open("test.json", mode = "w", encoding = "utf-8") as f:
        for el in lst:
            s = json.dumps(el, ensure_ascii=True) + " "
            f.write(s)
    # 读取
    with open("test.json", mode = "r", encoding = "utf-8") as f:
        for line in f:
            dic = json.loads(line.strip())
            print(dic)
 # 两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串

   参数设置,格式化输出学习一下: https://www.cnblogs.com/Eva-J/articles/7228075.html#_label9

原文地址:https://www.cnblogs.com/guyannanfei/p/10188036.html