• python标准库学习8


      

    使用sys重定向输出

    import sys
    import string
    
    class Redirect:
    
        def _ _init_ _(self, stdout):
            self.stdout = stdout
    
        def write(self, s):
            self.stdout.write(string.lower(s))
    
    # redirect standard output (including the print statement)
    # 重定向标准输出(包括print语句)
    old_stdout = sys.stdout
    sys.stdout = Redirect(sys.stdout)
    
    print "HEJA SVERIGE",
    print "FRISKT HUM\303\226R"
    
    # restore standard output
    # 恢复标准输出
    sys.stdout = old_stdout
    
    print "M\303\205\303\205\303\205\303\205L!"
    
    heja sverige friskt hum\303\266r
    M\303\205\303\205\303\205\303\205L!
    

      

    使用sys模块退出程序

    import sys
    
    print "hello"
    
    sys.exit(1)
    
    print "there"
    
    hello
    

      注意 sys.exit 并不是立即退出. 而是引发一个 SystemExit 异常. 这意味着你可以在主程序中捕获对 sys.exit 的调用

    捕获sys.exit调用

    import sys
    
    print "hello"
    
    try:
        sys.exit(1)
    except SystemExit:
        pass
    
    print "there"
    
    hello
    there
    

      如果准备在退出前自己清理一些东西(比如删除临时文件), 你可以配置一个 "退出处理函数"(exit handler), 它将在程序退出的时候自动被调用

    另一种捕获sys.exit调用的方法

    import sys
    
    def exitfunc():
        print "world"
    
    sys.exitfunc = exitfunc
    
    print "hello"
    sys.exit(1)
    print "there" # never printed # 不会被 print
    
    hello
    world
    

      在 Python 2.0 以后, 你可以使用 atexit 模块来注册多个退出处理函数.

     atexit 模块允许你注册一个或多个终止函数(暂且这么叫), 这些函数将在解释器终止前被自动调用.

    调用 register 函数, 便可以将函数注册为终止函数,你也可以添加更多的参数, 这些将作为 exit 函数的参数传递.

    使用 atexit 模块

    import atexit
    
    def exit(*args):
        print "exit", args
    
    # register two exit handler
    atexit.register(exit)
    atexit.register(exit, 1)
    atexit.register(exit, "hello", "world")
    
    exit ('hello', 'world')
    exit (1,)
    exit ()
    

      

    time 模块提供了一些处理日期和一天内时间的函数. 它是建立在 C 运行时库的简单封装.

    给定的日期和时间可以被表示为浮点型(从参考时间, 通常是 1970.1.1 到现在经过的秒数. 即 Unix 格式), 或者一个表示时间的 struct (类元组).

    使用 time 模块获取当前时间

    import time
    
    now = time.time()
    
    print now, "seconds since", time.gmtime(0)[:6]
    print
    print "or in other words:"
    print "- local time:", time.localtime(now)
    print "- utc:", time.gmtime(now)
    
    937758359.77 seconds since (1970, 1, 1, 0, 0, 0)
    
    or in other words:
    - local time: (1999, 9, 19, 18, 25, 59, 6, 262, 1)
    - utc: (1999, 9, 19, 16, 25, 59, 6, 262, 0)
    

      

    使用 time 模块格式化时间输出

    import time
    
    now = time.localtime(time.time())
    
    print time.asctime(now)
    print time.strftime("%y/%m/%d %H:%M", now)
    print time.strftime("%a %b %d", now)
    print time.strftime("%c", now)
    print time.strftime("%I %p", now)
    print time.strftime("%Y-%m-%d %H:%M:%S %Z", now)
    
    # do it by hand...
    year, month, day, hour, minute, second, weekday, yearday, daylight = now
    print "%04d-%02d-%02d" % (year, month, day)
    print "%02d:%02d:%02d" % (hour, minute, second)
    print ("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN")[weekday], yearday
    
    Sun Oct 10 21:39:24 1999
    99/10/10 21:39
    Sun Oct 10
    Sun Oct 10 21:39:24 1999
    09 PM
    1999-10-10 21:39:24 CEST
    1999-10-10
    21:39:24
    SUN 283
    

      在一些平台上, time 模块包含了 strptime 函数, 它的作用与 strftime 相反. 给定一个字符串和模式, 它返回相应的时间对象

    使用 time.strptime 函数解析时间

    import time
    
    # make sure we have a strptime function!
    # 确认有函数 strptime
    try:
        strptime = time.strptime
    except AttributeError:
        from strptime import strptime
    
    print strptime("31 Nov 00", "%d %b %y")
    print strptime("1 Jan 70 1:30pm", "%d %b %y %I:%M%p")
    

      

    strptime 不完全实现

    import re
    import string
    
    MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
              "Sep", "Oct", "Nov", "Dec"]
    
    SPEC = {
        # map formatting code to a regular expression fragment
        "%a": "(?P<weekday>[a-z]+)",
        "%A": "(?P<weekday>[a-z]+)",
        "%b": "(?P<month>[a-z]+)",
        "%B": "(?P<month>[a-z]+)",
        "%C": "(?P<century>\d\d?)",
        "%d": "(?P<day>\d\d?)",
        "%D": "(?P<month>\d\d?)/(?P<day>\d\d?)/(?P<year>\d\d)",
        "%e": "(?P<day>\d\d?)",
        "%h": "(?P<month>[a-z]+)",
        "%H": "(?P<hour>\d\d?)",
        "%I": "(?P<hour12>\d\d?)",
        "%j": "(?P<yearday>\d\d?\d?)",
        "%m": "(?P<month>\d\d?)",
        "%M": "(?P<minute>\d\d?)",
        "%p": "(?P<ampm12>am|pm)",
        "%R": "(?P<hour>\d\d?):(?P<minute>\d\d?)",
        "%S": "(?P<second>\d\d?)",
        "%T": "(?P<hour>\d\d?):(?P<minute>\d\d?):(?P<second>\d\d?)",
        "%U": "(?P<week>\d\d)",
        "%w": "(?P<weekday>\d)",
        "%W": "(?P<weekday>\d\d)",
        "%y": "(?P<year>\d\d)",
        "%Y": "(?P<year>\d\d\d\d)",
        "%%": "%"
    }
    
    class TimeParser:
        def _ _init_ _(self, format):
            # convert strptime format string to regular expression
            format = string.join(re.split("(?:\s|%t|%n)+", format))
            pattern = []
            try:
                for spec in re.findall("%\w|%%|.", format):
                    if spec[0] == "%":
                        spec = SPEC[spec]
                    pattern.append(spec)
            except KeyError:
                raise ValueError, "unknown specificer: %s" % spec
            self.pattern = re.compile("(?i)" + string.join(pattern, ""))
        def match(self, daytime):
            # match time string
            match = self.pattern.match(daytime)
            if not match:
                raise ValueError, "format mismatch"
            get = match.groupdict().get
            tm = [0] * 9
            # extract date elements
            y = get("year")
            if y:
                y = int(y)
                if y < 68:
                    y = 2000 + y
                elif y < 100:
                    y = 1900 + y
                tm[0] = y
            m = get("month")
            if m:
                if m in MONTHS:
                    m = MONTHS.index(m) + 1
                tm[1] = int(m)
            d = get("day")
            if d: tm[2] = int(d)
            # extract time elements
            h = get("hour")
            if h:
                tm[3] = int(h)
            else:
                h = get("hour12")
                if h:
                    h = int(h)
                    if string.lower(get("ampm12", "")) == "pm":
                        h = h + 12
                    tm[3] = h
            m = get("minute")
            if m: tm[4] = int(m)
            s = get("second")
            if s: tm[5] = int(s)
            # ignore weekday/yearday for now
            return tuple(tm)
    
    def strptime(string, format="%a %b %d %H:%M:%S %Y"):
        return TimeParser(format).match(string)
    
    if _ _name_ _ == "_ _main_ _":
        # try it out
        import time
        print strptime("2000-12-20 01:02:03", "%Y-%m-%d %H:%M:%S")
        print strptime(time.ctime(time.time()))
    
    (2000, 12, 20, 1, 2, 3, 0, 0, 0)
    (2000, 11, 15, 12, 30, 45, 0, 0, 0)
    

      

    使用 time 模块将本地时间元组转换为时间值(整数)

    import time
    
    t0 = time.time()
    tm = time.localtime(t0)
    
    print tm
    
    print t0
    print time.mktime(tm)
    
    (1999, 9, 9, 0, 11, 8, 3, 252, 1)
    936828668.16
    936828668.0
    

      

    将 UTC 时间元组转换为时间值(整数)

    import time
    
    def _d(y, m, d, days=(0,31,59,90,120,151,181,212,243,273,304,334,365)):
        # map a date to the number of days from a reference point
        return (((y - 1901)*1461)/4 + days[m-1] + d +
            ((m > 2 and not y % 4 and (y % 100 or not y % 400)) and 1))
    
    def timegm(tm, epoch=_d(1970,1,1)):
        year, month, day, h, m, s = tm[:6]
        assert year >= 1970
        assert 1 <= month <= 12
        return (_d(year, month, day) - epoch)*86400 + h*3600 + m*60 + s
    
    t0 = time.time()
    tm = time.gmtime(t0)
    
    print tm
    
    print t0
    print timegm(tm)
    
    (1999, 9, 8, 22, 12, 12, 2, 251, 0)
    936828732.48
    936828732
    

      

    使用 time 模块评价算法

    import time
    
    def procedure():
        time.sleep(2.5)
    
    # measure process time
    t0 = time.clock()
    procedure()
    print time.clock() - t0, "seconds process time"
    
    # measure wall time
    t0 = time.time()
    procedure()
    print time.time() - t0, "seconds wall time"
    
    0.0 seconds process time
    2.50903499126 seconds wall time
    

      

    使用 types 模块

    import types
    
    def check(object):
        print object,
    
        if type(object) is types.IntType:
            print "INTEGER",
        if type(object) is types.FloatType:
            print "FLOAT",
        if type(object) is types.StringType:
            print "STRING",
        if type(object) is types.ClassType:
            print "CLASS",
        if type(object) is types.InstanceType:
            print "INSTANCE",
        print
    
    check(0)
    check(0.0)
    check("0")
    
    class A:
        pass
    
    class B:
        pass
    
    check(A)
    check(B)
    
    a = A()
    b = B()
    
    check(a)
    check(b)
    
    0 INTEGER
    0.0 FLOAT
    0 STRING
    A CLASS
    B CLASS
    <A instance at 796960> INSTANCE
    <B instance at 796990> INSTANCE
    

      

    使用 gc 模块收集循环引用垃圾

    import gc
    
    # create a simple object that links to itself
    class Node:
    
        def _ _init_ _(self, name):
            self.name = name
            self.parent = None
            self.children = []
    
        def addchild(self, node):
            node.parent = self
            self.children.append(node)
    
        def _ _repr_ _(self):
            return "<Node %s at %x>" % (repr(self.name), id(self))
    
    # set up a self-referencing structure
    root = Node("monty")
    
    root.addchild(Node("eric"))
    root.addchild(Node("john"))
    root.addchild(Node("michael"))
    
    # remove our only reference
    del root
    
    print gc.collect(), "unreachable objects"
    print gc.collect(), "unreachable objects"
    
    12 unreachable objects
    0 unreachable objects
    

      

  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2264909.html
Copyright © 2020-2023  润新知