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

  


==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2011/11/27/2264909.html,如需转载请自行联系原作者
相关文章
|
26天前
|
XML JSON 数据库
Python的标准库
Python的标准库
164 77
|
22天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
4天前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
13天前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
24天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
28天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
27天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
27天前
|
XML JSON 数据库
Python的标准库
Python的标准库
48 11
|
2月前
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
135 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
24天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。