zoukankan      html  css  js  c++  java
  • 27 os 模块 序列化模块 sys模块 时间模块

    主要内容:

    1 : 时间模块

      a: 时间戳时间 ,格林威治时间, float数据类型 ,给机器用的

        英国伦敦时间  1970.1.1  0:0:0

        北京时间          1970.1.1 8:0:0

      time.time()        获取时间戳时间

    import time
    print(time.time())

      b: 结构化时间,时间对象,能够通过.属性名来获取对象中的值.

        time.localtime()  获取结构化时间

    struct_time = time.localtime()
    print(struct_time)   #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=19, tm_min=13, tm_sec=37, tm_wday=2, tm_yday=220, tm_isdst=0)

      c: 格式化时间: 字符串时间, str数据类型,给人看的

        time.strftime()    获取格式化时间

    struct_time = time.localtime()
    print(struct_time)   #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=19, tm_min=13, tm_sec=37, tm_wday=2, tm_yday=220, tm_isdst=0)
    

      d: 三种模式之间的转换

        1)  格式化时间--> strptime('格式化时间','%Y-%m-%d') <--结构化时间<-- mktime(结构化时间) -->时间戳时间

    import time
    formatstring = time.strftime('%y-%m-%d')
    struct_time = time.strptime(formatstring,'%y-%m-%d')
    timestamp = time.mktime(struct_time)
    print(timestamp)
    

        2)  时间戳时间--> localtime(timestamp)<--结构化时间-->strftime('时间格式',格式化时间)

    import time
    timestamp = time.time()
    struct_time = time.localtime(timestamp)
    print(struct_time)
    formatsring = time.strftime('%y-%m-%d',struct_time)
    print(formatsring)
    

      e: 一道题:计算本地一月的时间戳时间

    import time
    formatstring = time.strftime('%y-%m-1')
    struct_time = time.strptime('formatstring','%y-%m-%d')
    timestamp = time.mktime(struct_time)
    print(timestamp)
    

        第二种方法:

    import time
    struct_time = time.localtime()
    struct_time = time.strptime('%s-%s-1' % (struct_time.tm_year,struct_time.tm_mon),'%Y-%m-%d')
    timestamp = time.mktime(struct_time)
    print(timestamp)
    

    2 . sys模块  :跟python解释器打交道的(sys模块是与python解释器交互的一个接口)

      a: sys.platform  :返回操作系统平台名称

      b: sys.exit()        退出程序

    import sys            #跟python解释器打交道的
    print(sys.platform)   #操作平台win32
    sys.exit()            #结束程序再写print会报错
    print(123)
    

      c: sys.argv    : 命令行参数list

        1) :返回一个列表 

          第一个元素, 是执行这个文件的时候, 写在python命令后面的第一个值,

          之后的元素,在执行python的启动的时候可以写多个值, 都会被依次添加到列表中.

        2): 用处

    name = sys.argv[1]
    pwd = sys.argv[2]
    if name == 'alex' and pwd == 'alex3714':
        print('执行以下代码')
    else:
        exit()
    

    3 . os模块

      a: 创建和删除文件夹

        创建文件夹:

    import os
    os.mkdir('dir')  # ftp 网盘                     生成单级文件夹
    os.mkdir('dir/dir5')  # ftp 网盘
    os.makedirs('dir2/dir3/dir4',exist_ok=True)    生成多级文件夹
    

        删除文件夹:

    os.remove('dir2/dir3/dir4/aaa.py')             删除文件
    os.rmdir('dir2/dir3/dir4')                     不能删除一个非空文件夹 ,删除单级文件夹
    os.removedirs('dir2/dir3/dir4')
    递归向上删除文件夹,只要删除当前目录之后 发现上一级目录也为空了,就把上一级目录也删掉.
    如果发现上一级目录有其他文件,就停止
    

      b: os.listdir:  列出指定目录下的所有文件和子目录,并以列表方式打印.

    import os
    print(os.listdir(r'C:Users26897PycharmProjectsuntitledWorkspace'))
    # ['day  20', 'day 02', 'day 21 反射', 'day01', 'day03', 'day04', 'day05', 'day06', 'day07', 'day08', 'day09', 'day10', 'day11考试', 'day12', 'day13', 
    'day14', 'day15', 'day16 类,对象调用类中的变量和方法', 'day17 类,对象的查询空间,组合', 'day18 继承,单,多继承;新式类,经典类', 'day22 考试', 'day23', 'day24', '
    day25 正则表达式', 'day26', 'day27', '作业', '学生选课']

      c :

    import os
    print(os.stat(r'C:Users26897PycharmProjectsuntitledWorkspaceday25 正则表达式练习.py')) #获取文件目录信息
    print(os.sep)  # 当前你所在的操作系统的目录分割符    /a/dir/dir2
    print([os.linesep])  #输出当前平台使用的行终止符,win下为"
    ",Linux下为"
    "
    print(os.pathsep) #   输出用于分割文件路径的字符串 win下为;,Linux下为:
    print(os.name) # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    

      d: print(os.environ)       :获取系统环境变量

      e:  os.path.dirname(path) # 返回path的上一级目录,即是os.path.split(path) 的第一个元素

    os.path.dirname(path)  # 返回path的上一级目录,即是os.path.split(path) 的第一个元素
    print(os.path.dirname(r'C:Users26897PycharmProjectsuntitledWorkspaceday27')) 
    #返回path的上一级目录,即是os.path.split(path) 的第一个元素
    

      f:  os.path.split(path) # 将path分割成目录和文件名二元组返回,

    # print(os.path.split(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))
    # print(os.path.split(r'C:Users26897PycharmProjectsuntitledWorkspaceday27'))
    

      h: os.path.isfile(path) #判断path是不是一个存在的文件,如果是返回ture,否则false

       os.path.isdir(path) #判断path是不是一个存在的目录,如果是返回ture,否则false

    import os
    print(os.path.isfile(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))  #ture
    print(os.path.isdir(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))   #false
    print(os.path.isdir(r'C:Users26897PycharmProjectsuntitledWorkspaceday27'))              #ture
    

      g:  os.path.join() #将多个路径组合后返回,(第一个绝对路径之前的参数将被忽略.)

    import os
    ret = os.path.join(r'C:Users26897PycharmProjectsuntitledWorkspaceday27','aaa','bbb')
    print(os.path.abspath(ret))
    # C:Users26897PycharmProjectsuntitledWorkspaceday27aaabb
    

      l: os.path.getsize(path) 返回path的大小

    import os
    print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday27lianxi.py'))  #428
    print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday24'))             #4096
    print(os.path.getsize(r'C:Users26897PycharmProjectsuntitledWorkspaceday23'))             #4096
    
    #文件夹都是4096字节,所有的都一样,文件大小精确统计
    

      m : os.path.exist()  : 判断path是否存在  os.path.isabs() : 判断path是不是决定路径,如果是返回ture

      n : os.path.basename(path) : 返回最后一层文件或者目录

    print(os.path.basename('D:/sylar/python_workspace/day25'))                      #day25
    print(os.path.basename('D:/sylar/python_workspace/day25/5.os模块.py'))         #5.os模块.py
    

    4 . 序列化  : 把原本的字典 , 列表等内容转换成字符串的过程.

      a : 为什么要序列化 : 要把内容写入文件    ,      网络传输数据

      b :反序列化 : 字符串 --> 字典,列表 , 数字 , 对象

      c : json 的四个方法 :jumps  loads jump load

        1) json . jumps    jumps.loads

    dic = {'aaa':'bbb','ccc':'ddd'}
    str_dic = json.dumps(dic)
    print(str_dic)             #{"aaa": "bbb", "ccc": "ddd"}     将字典转转换成字符串
    print([str_dic])           #['{"aaa": "bbb", "ccc": "ddd"}']
    注意,json转换完的字符串类型的字典中的字符串是由""表示的
    with open('json_dunp','w')as f:
        f.write(str_dic)
    ret = json.loads(str_dic)    #反序列化: 将一个字符串格式的字典转换成一个字典
    print(ret)                 #{'aaa': 'bbb', 'ccc': 'ddd'}
    注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    

           2) json. jump,      json. load

    import json
    f = open('json_file','w')
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    f.close()
    
    f = open('json_file')
    dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    f.close()
    print(type(dic2),dic2)
    

        3)  json 限制问题

          @   json格式的限制1,json格式的key必须是字符串数据类型,如果是数字为key,那么dump之后会强行转成字符串数据类型

    import json
    dic = {1:2,3:4}
    str_dic = json.dumps(dic)
    print(str_dic)            #{"1": 2, "3": 4}
    new_dic = json.loads(str_dic)
    print(new_dic)            #{'1': 2, '3': 4}
    

          @  json是否支持元祖作为key : 不支持

    dic = {(1,2,3):3, ('a','b','c'):4}
    str_dic1 = json.dumps(dic)
    print(str_dic1)                   #keys must be a string
    

          @  json是否支持元祖作为value :支持,会把value转变成列表

    dic = {3:(1,2,3), 4:('a','b','c')}
    str_dic1 = json.dumps(dic)        #{"3": [1, 2, 3], "4": ["a", "b", "c"]}
    print(str_dic1)
    new_dic1 = json.loads(str_dic1)   #{'3': [1, 2, 3], '4': ['a', 'b', 'c']}
    print(new_dic1)
    

          @  对列表的dump

    import json
    li = ['ser',1,'a', (1,2,3)]
    with open('uin','w')as f:
        json.dump(li,f)
    with open('uin', 'r')as f:
        json.load(f)
        print(li, type(li))
    

          @  能不能多次dump数据到文件里,可以多次dump但是不能load出来了

    import json
    dic = {1:2,'a':(1,2,4)}
    lst = ['a', 'b']
    with open('str', 'w')as f :
        json.dump(dic,f)
        json.dump(lst,f)
    with open('str','r')as f:
        json.load(f)             #报错
    

                想dump多个数据进入文件,用dumps

    import json
    dic = {1:2,'a':(1,2,4)}
    lst = ['a', 'b']
    str_dic = json.dumps(dic)
    str_lst = json.dumps(lst)
    with open('iii','w')as f:
        f.write(str_dic + '
    ')
        f.write(str_lst + '
    ')
        f.close()
    with open('iii')as f:
        for line in f:
            ret = json.loads(line)
            print(ret)
    

          @  中文格式 加了ensure_ascii=false中文就可以原样输出

    import json
    dic = {'a':1,'每天':2}
    str_dic = json.dumps(dic, ensure_ascii=False)
    print(str_dic)             #{"a": 1, "u6bcfu5929": 2}
    

          @  json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间(ident缩进, ensure_ascii = false显示中文separators分隔符)

    import json
    data = {'username':['李华','二愣子'],'sex':'male','age':16}
    json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
    print(json_dic2)
    

          @  set不能被dump/dumps

    import json
    set = {2,3,4,'a',9,(2,4,5)}
    str_set = json.dumps(set)
    print(str_set)          #报错Object of type 'set' is not JSON serializable
    

      d : pickle

        dump的结果是bytes, dump用的f文件句柄需要以wb的形式打开,load所用的f是'rb'模式

    import pickle
    dic = {1:2,3:4}
    str_dic = pickle.dumps(dic)
    print(str_dic)               #b'x80x03}qx00(Kx01Kx02Kx03Kx04u.'
    new_dic = pickle.loads(str_dic)
    print(new_dic)               #{1: 2, 3: 4}

        对于对象的序列化需要这个对象对应的类在内存中

    class Student:
        def __init__(self,name, age):
            self.name = name
            self.age = age
    s = Student('lily',34)
    str_S = pickle.dumps(s)
    new_s = pickle.loads(str_S)
    print(new_s)      #<__main__.Student object at 0x000001DE1915D550>
    print(new_s.name) #lily

        对于多次dump/load做了良好的处理.

    import pickle
    with open('pickle_demo','wb') as f:
        pickle.dump({'k1':'v1'}, f)
        pickle.dump({'k11':'v1'}, f)
        pickle.dump({'k11':'v1'}, f)
        pickle.dump({'k12':[1,2,3]}, f)
        pickle.dump(['k1','v1','l1'], f)
    with open('pickle_demo','rb')as f :
        while 1:
            try:
                print(pickle.load(f))
            except EOFError:
                break
    

      e: pickle 和 json 的区别:

        json :    有限制 ,字符串, 字典 , 列表, 数字   支持所有语言

        pickle:   几乎支持所有的对象.

      f : shelve   (稍微了解)只有一个方法

    import shelve
    f = shelve.open('shelve_demo')
    f['key'] = {'k1':(1,2,3),'k2':'v2'}
    f.close()
    f = shelve.open('shelve_demo')
    content = f['key']
    f.close()
    print(content) 
    # shelve  如果你写定了一个文件
    # 改动的比较少
    # 读文件的操作比较多
    # 且你大部分的读取都需要基于某个key获得某个value

      

      

      

  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9445535.html
Copyright © 2011-2022 走看看