zoukankan      html  css  js  c++  java
  • python之(24)中级总结(2) 时间模块,json和xml模块学习总结

    1、Python3 日期和时间

    Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。

    Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。

    时间间隔是以秒为单位的浮点小数。

    每个时间戳都以自从 1970 年 1 月 1 日午夜(历元)经过了多长时间来表示。

    1、什么是时间元组?

    很多Python函数用一个元组装起来的9组数字处理时间:

    序号字段
    0 4位数年 2008
    1 1 到 12
    2 1到31
    3 小时 0到23
    4 分钟 0到59
    5 0到61 (60或61 是闰秒)
    6 一周的第几日 0到6 (0是周一)
    7 一年的第几日 1到366 (儒略历)
    8 夏令时 -1, 0, 1, -1是决定是否为夏令时的旗帜

    上述也就是struct_time元组。这种结构具有如下属性:

    序号属性
    0 tm_year 2008
    1 tm_mon 1 到 12
    2 tm_mday 1 到 31
    3 tm_hour 0 到 23
    4 tm_min 0 到 59
    5 tm_sec 0 到 61 (60或61 是闰秒)
    6 tm_wday 0到6 (0是周一)
    7 tm_yday 一年中的第几天,1 到 366
    8 tm_isdst 是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1

    2、Time 模块

    Time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的:

    序号函数及描述实例
    1 time.altzone 返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。 以下实例展示了 altzone()函数的使用方法:>>> import time >>> print ("time.altzone %d " % time.altzone) time.altzone -28800
    2 time.asctime([tupletime]) 接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。 以下实例展示了 asctime()函数的使用方法:>>> import time >>> t = time.localtime() >>> print ("time.asctime(t): %s " % time.asctime(t)) time.asctime(t): Thu Apr 7 10:36:20 2016
    3 [time.clock()] 用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。 由于该方法依赖操作系统,在 Python 3.3 以后不被推荐,而在 3.8 版本中被移除,需使用下列两个函数替代。time.perf_counter() # 返回系统运行时间 time.process_time() # 返回进程运行时间
    4 time.ctime([secs]) 作用相当于asctime(localtime(secs)),未给参数相当于asctime() 以下实例展示了 ctime()函数的使用方法:>>> import time >>> print ("time.ctime() : %s" % time.ctime()) time.ctime() : Thu Apr 7 10:51:58 2016
    5 time.gmtime([secs]) 接收时间戳(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。注:t.tm_isdst始终为0 以下实例展示了 gmtime()函数的使用方法:>>> import time >>> print ("gmtime :", time.gmtime(1455508609.34375)) gmtime : time.struct_time(tm_year=2016, tm_mon=2, tm_mday=15, tm_hour=3, tm_min=56, tm_sec=49, tm_wday=0, tm_yday=46, tm_isdst=0)
    6 time.localtime([secs] 接收时间戳(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)。 以下实例展示了 localtime()函数的使用方法:>>> import time >>> print ("localtime(): ", time.localtime(1455508609.34375)) localtime(): time.struct_time(tm_year=2016, tm_mon=2, tm_mday=15, tm_hour=11, tm_min=56, tm_sec=49, tm_wday=0, tm_yday=46, tm_isdst=0)
    7 [time.mktime(tupletime)] 接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)。  
    8 time.sleep(secs) 推迟调用线程的运行,secs指秒数。 以下实例展示了 sleep()函数的使用方法:#!/usr/bin/python3 import time print ("Start : %s" % time.ctime()) time.sleep( 5 ) print ("End : %s" % time.ctime())
    9 time.strftime(fmt[,tupletime]) 接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。 以下实例展示了 strftime()函数的使用方法:>>> import time >>> print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) 2016-04-07 11:18:05
    10 time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') 根据fmt的格式把一个时间字符串解析为时间元组。 以下实例展示了 strptime()函数的使用方法:>>> import time >>> struct_time = time.strptime("30 Nov 00", "%d %b %y") >>> print ("返回元组: ", struct_time) 返回元组: time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
    11 time.time( ) 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。 以下实例展示了 time()函数的使用方法:>>> import time >>> print(time.time()) 1459999336.1963577
    12 [time.tzset()]) 根据环境变量TZ重新初始化时间相关设置。  
    13 time.perf_counter() 返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。  
    14 time.process_time() 返回当前进程执行 CPU 的时间总和,不包含睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。  

    Time模块包含了以下2个非常重要的属性:

    序号属性及描述
    1 time.timezone 属性time.timezone是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。
    2 time.tzname 属性time.tzname包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。
    1、示例
    import time
    
    # 1、获取本地时间
    print("本地时间:", time.localtime(time.time()))
    # 2、获取格式化的时间
    print("本地时间:", time.asctime(time.localtime(time.time())))
    # 3、格式化日期
    # 格式化成2016-03-20 11:45:39形式
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    # 格式化成Sat Mar 28 22:24:24 2016形式
    print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
    # 将格式字符串转换为时间戳
    a = "Sat Mar 28 22:24:24 2016"
    print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))

    结果:

    C:Anaconda3envsFlinkUdfpython.exe C:/app/FlinkUdf/src/main/Python/Practice/Test.py
    本地时间: time.struct_time(tm_year=2020, tm_mon=12, tm_mday=1, tm_hour=11, tm_min=17, tm_sec=9, tm_wday=1, tm_yday=336, tm_isdst=0)
    本地时间: Tue Dec  1 11:17:09 2020
    2020-12-01 11:17:09
    Tue Dec 01 11:17:09 2020
    1459175064.0
    
    Process finished with exit code 0

    3、python中时间日期格式化符号:

    • %y 两位数的年份表示(00-99)
    • %Y 四位数的年份表示(000-9999)
    • %m 月份(01-12)
    • %d 月内中的一天(0-31)
    • %H 24小时制小时数(0-23)
    • %I 12小时制小时数(01-12)
    • %M 分钟数(00=59)
    • %S 秒(00-59)
    • %a 本地简化星期名称
    • %A 本地完整星期名称
    • %b 本地简化的月份名称
    • %B 本地完整的月份名称
    • %c 本地相应的日期表示和时间表示
    • %j 年内的一天(001-366)
    • %p 本地A.M.或P.M.的等价符
    • %U 一年中的星期数(00-53)星期天为星期的开始
    • %w 星期(0-6),星期天为星期的开始
    • %W 一年中的星期数(00-53)星期一为星期的开始
    • %x 本地相应的日期表示
    • %X 本地相应的时间表示
    • %Z 当前时区的名称
    • %% %号本身

    4、

    日历(Calendar)模块

    此模块的函数都是日历相关的,例如打印某月的字符月历。

    星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数。模块包含了以下内置函数:

    序号函数及描述
    1 calendar.calendar(year,w=2,l=1,c=6) 返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
    2 calendar.firstweekday( ) 返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。
    3 calendar.isleap(year) 是闰年返回 True,否则为 false。>>> import calendar >>> print(calendar.isleap(2000)) True >>> print(calendar.isleap(1900)) False
    4 calendar.leapdays(y1,y2) 返回在Y1,Y2两年之间的闰年总数。
    5 calendar.month(year,month,w=2,l=1) 返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
    6 calendar.monthcalendar(year,month) 返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
    7 calendar.monthrange(year,month) 返回两个整数。第一个是该月的星期几,第二个是该月有几天。星期几是从0(星期一)到 6(星期日)。>>> import calendar >>> calendar.monthrange(2014, 11) (5, 30)(5, 30)解释:5 表示 2014 年 11 月份的第一天是周六,30 表示 2014 年 11 月份总共有 30 天。
    8 calendar.prcal(year, w=0, l=0, c=6, m=3) 相当于 print (calendar.calendar(year, w=0, l=0, c=6, m=3))。
    9 calendar.prmonth(theyear, themonth, w=0, l=0) 相当于 print(calendar.month(theyear, themonth, w=0, l=0))
    10 calendar.setfirstweekday(weekday) 设置每周的起始日期码。0(星期一)到6(星期日)。
    11 calendar.timegm(tupletime) 和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。
    12 calendar.weekday(year,month,day) 返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。
    import calendar
    
    # 1、获取某月日历
    print(calendar.month(2020, 6))
    print(calendar.monthcalendar(2020,10))
    C:Anaconda3envsFlinkUdfpython.exe C:/app/FlinkUdf/src/main/Python/Practice/Test.py
         June 2020
    Mo Tu We Th Fr Sa Su
     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    
    [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25], [26, 27, 28, 29, 30, 31, 0]]
    
    Process finished with exit code 0

     2、Python3 JSON 数据解析

    Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

    • json.dumps(): 对数据进行编码。

    • json.loads(): 对数据进行解码。

    img

    在j son 的编解码过程中,Python 的原始类型与 json 类型会相互转换,具体的转化对照如下:

    1、Python 编码为 JSON 类型转换对应表:

    PythonJSON
    dict object
    list, tuple array
    str string
    int, float, int- & float-derived Enums number
    True true
    False false
    None null

    2、JSON 解码为 Python 类型转换对应表:

    JSONPython
    object dict
    array list
    string str
    number (int) int
    number (real) float
    true True
    false False
    null None

    3、 实例

    import json
    
    # Python 字典类型转换为 JSON 对象
    data = {
        'no': 1,
        'name': 'Runoob',
        'url': 'http://www.runoob.com'
    }
    # 1、原始数据
    print(repr(data))
    # 2、字符串转json
    json_dumps = json.dumps(data)
    print(json_dumps)
    # 3、json解码成原始数据
    json_loads = json.loads(json_dumps)
    print(json_loads['name'])

    结果:

    C:Anaconda3envsFlinkUdfpython.exe C:/app/FlinkUdf/src/main/Python/Practice/Test.py
    {'no': 1, 'name': 'Runoob', 'url': 'http://www.runoob.com'}
    {"no": 1, "name": "Runoob", "url": "http://www.runoob.com"}
    Runoob
    
    Process finished with exit code 0

    3、Python3 XML 解析

    XML 被设计用来传输和存储数据。

    XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

    它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

    1、make_parser 方法

    以下方法创建一个新的解析器对象并返回。

    xml.sax.make_parser( [parser_list] )

    参数说明:

    • parser_list - 可选参数,解析器列表

    2、parser 方法

    以下方法创建一个 SAX 解析器并解析xml文档

    xml.sax.parse( xmlfile, contenthandler[, errorhandler])

    参数说明:

    • xmlfile - xml文件名

    • contenthandler - 必须是一个 ContentHandler 的对象

    • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

    3、parseString 方法

    parseString 方法创建一个 XML 解析器并解析 xml 字符串

    xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

    参数说明:

    • xmlstring - xml字符串

    • contenthandler - 必须是一个 ContentHandler 的对象

    • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler对象


    1、Python 对 XML 的解析

    常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。

    Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:

    1.Python 使用 SAX 解析 xml

    Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。

    SAX 是一种基于事件驱动的API。

    利用 SAX 解析 XML 文档牵涉到两个部分: 解析器事件处理器

    解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。

    而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。

    • 1、对大型文件进行处理;

    • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。

    • 3、想建立自己的对象模型的时候。

    在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。

    1、ContentHandler 类方法介绍

    characters(content) 方法

    调用时机:

    从行开始,遇到标签之前,存在字符,content 的值为这些字符串。

    从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。

    从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。

    标签可以是开始标签,也可以是结束标签。

    startDocument() 方法

    文档启动的时候调用。

    endDocument() 方法

    解析器到达文档结尾时调用。

    startElement(name, attrs) 方法

    遇到XML开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。

    endElement(name) 方法

    遇到XML结束标签时调用。

    示例:
    import xml.sax
    
    
    class MovieHandler(xml.sax.ContentHandler):
        # 1、初始化xml数据
        def __init__(self):
            self.CurrentData = ""
            self.type = ""
            self.format = ""
            self.year = ""
            self.rating = ""
            self.stars = ""
            self.description = ""
    
        # 2、元素开始调用
        def startElement(self, tag, attributes):
            self.CurrentData = tag
            if tag == "movie":
                print("*****Movie*****")
                title = attributes["title"]
                print("Title:", title)
    
        # 3、元素结束调用
        def endElement(self, tag):
            if self.CurrentData == "type":
                print("Type:", self.type)
            elif self.CurrentData == "format":
                print("Format:", self.format)
            elif self.CurrentData == "year":
                print("Year:", self.year)
            elif self.CurrentData == "rating":
                print("Rating:", self.rating)
            elif self.CurrentData == "stars":
                print("Stars:", self.stars)
            elif self.CurrentData == "description":
                print("Description:", self.description)
                self.CurrentData = ""
    
        # 4、读取字符时调用
        def characters(self, content):
            if self.CurrentData == "type":
                self.type = content
            elif self.CurrentData == "format":
                self.format = content
            elif self.CurrentData == "year":
                self.year = content
            elif self.CurrentData == "rating":
                self.rating = content
            elif self.CurrentData == "stars":
                self.stars = content
            elif self.CurrentData == "description":
                self.description = content
    
    
    # 5、测试
    if __name__ == "__main_":
        # 1、创建一个 XMLReader
        make_parser = xml.sax.make_parser()
        # 2、关闭命名空间
        make_parser.setFeature(xml.sax.handler.feature_namespaces, 0)
        # 3、重写 ContextHandler
        Handler = MovieHandler()
        make_parser.setContentHandler(Handler)
        make_parser.parse("src/Img/movies.xml")
    2.DOM(Document Object Model)

    文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

    一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

    python中用xml.dom.minidom来解析xml文件

    from xml.dom.minidom import parse
    import xml.dom.minidom
    
    # 使用minidom解析器打开 XML 文档
    DOMTree = xml.dom.minidom.parse("C:appFlinkUdfsrcImgmovies.xml")
    collection = DOMTree.documentElement
    if collection.hasAttribute("shelf"):
        print("Root element : %s" % collection.getAttribute("shelf"))
    
    # 在集合中获取所有电影
    movies = collection.getElementsByTagName("movie")
    
    # 打印每部电影的详细信息
    for movie in movies:
        print("*****Movie*****")
        if movie.hasAttribute("title"):
            print("Title: %s" % movie.getAttribute("title"))
    
        type = movie.getElementsByTagName('type')[0]
        print("Type: %s" % type.childNodes[0].data)
        format = movie.getElementsByTagName('format')[0]
        print("Format: %s" % format.childNodes[0].data)
        rating = movie.getElementsByTagName('rating')[0]
        print("Rating: %s" % rating.childNodes[0].data)
        description = movie.getElementsByTagName('description')[0]
        print("Description: %s" % description.childNodes[0].data)

     

  • 相关阅读:
    实验3 颜色、字符串资源使用
    存储管理实验
    内存的分配与回收
    实验三
    JavaScript事件循环机制
    Js练习代码
    学习笔记(es6 react vue)
    express中间件的理解
    es6-Promise对象学习
    iscroll插件的使用
  • 原文地址:https://www.cnblogs.com/huanghanyu/p/14069534.html
Copyright © 2011-2022 走看看