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

时间: 2024-10-31 02:22:22

python标准库学习8的相关文章

python标准库学习6

使用 apply 函数 def function(a, b):     print a, b   apply(function, ("whither", "canada?")) apply(function, (1, 2 + 3)) whither canada? 1 5 使用 apply 函数传递关键字参数 def function(a, b):     print a, b   apply(function, ("crunchy", &quo

python标准库学习9

fileinput 模块允许你循环一个或多个文本文件的内容 使用 fileinput 模块循环一个文本文件 import fileinput import sys   for line in fileinput.input("samples/sample.txt"):     sys.stdout.write("-> ")     sys.stdout.write(line)   -> We will perhaps eventually be writ

python标准库学习7

使用 os.path 模块处理文件名 import os   filename = "my/little/pony"   print "using", os.name, "..." print "split", "=>", os.path.split(filename) print "splitext", "=>", os.path.splitext(fi

python标准库学习5 ---bisect — Array bisection algorithm

#coding=utf-8   import bisect   list=[1,2,3,4,6,7,8,9]   #假定list已经排序 print bisect.bisect_left(list,5)  #返回5应该插入的索引位置   print bisect.bisect_right(list, 5)   print bisect.bisect(list,5)   bisect.insort_left(list, 5, 0, len(list)) print list   bisect.in

python标准库学习4

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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 8

Python标准库的学习准备

原文:Python标准库的学习准备 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识.   硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了

Python标准库——走马观花

原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   Python的一大好处在于它有一套很有用的标准库(standard library).标准库是随着Python一起安装在你的电脑中的,是Python的一部分 (当然也有特殊情况.有些场合会因为系统安全性的要求,不使用全部的标准库,比如说Google App Engine).   利用已有的类(class)和函数(function)进行开发

Python标准库07 信号 (signal包,部分os包)

原文:Python标准库07 信号 (signal包,部分os包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等.要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windo

Python标准库09 当前进程信息 (部分os包)

原文:Python标准库09 当前进程信息 (部分os包)  作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   我们在Linux的概念与体系,多次提及进程的重要性.Python的os包中有查询和修改进程信息的函数.学习Python的这些工具也有助于理解Linux体系.   进程信息 os包中相关函数如下: uname() 返回操作系统相关信息.类似于Linux上的uname命令. umask() 设置该进程创建文件时的权限m