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(filename)
print  "dirname" , "=>" , os.path.dirname(filename)
print  "basename" , "=>" , os.path.basename(filename)
print  "join" , "=>" , os.path.join(os.path.dirname(filename),
                                  os.path.basename(filename))
 
using nt ...
split = > ( 'my/little' , 'pony' )
splitext = > ( 'my/little/pony' , '')
dirname = > my / little
basename = > pony
join = > my / little\pony

  当前目录和上一级目录

>>> os.pardir
'..'
>>> os.curdir
'.'

  

使用 os.path 模块检查文件名的特征

import  os
 
FILES =  (
     os.curdir,
     "/" ,
     "file" ,
     "/file" ,
     "samples" ,
     "samples/sample.jpg" ,
     "directory/file" ,
     "../directory/file" ,
     "/directory/file"
     )
 
for  file  in  FILES:
     print  file , "=>" ,
     if  os.path.exists( file ):
         print  "EXISTS" ,
     if  os.path.isabs( file ):
         print  "ISABS" ,
     if  os.path.isdir( file ):
         print  "ISDIR" ,
     if  os.path.isfile( file ):
         print  "ISFILE" ,
     if  os.path.islink( file ):
         print  "ISLINK" ,
     if  os.path.ismount( file ):
         print  "ISMOUNT" ,
     print
 
. = > EXISTS ISDIR
/  = > EXISTS ISABS ISDIR ISMOUNT
file  = >
/ file  = > ISABS
samples = > EXISTS ISDIR
samples / sample.jpg = > EXISTS ISFILE
directory / file  = >
.. / directory / file  = >
/ directory / file  = > ISABS

  expanduser 函数以与大部分Unix shell相同的方式处理用户名快捷符号(~, 不过在 Windows 下工作不正常),

使用 os.path 模块将用户名插入到文件名

import  os
 
print  os.path.expanduser( "~/.pythonrc" )
 
# /home/effbot/.pythonrc

  expandvars 函数将文件名中的环境变量替换为对应值

使用 os.path 替换文件名中的环境变量

import  os
 
os.environ[ "USER" ] =  "user"
 
print  os.path.expandvars( "/home/$USER/config" )
print  os.path.expandvars( "$USER/folders" )
 
/ home / user / config
user / folders

  列出目录下所有的文件和目录

>>> a = [ file  for  file  in  os.listdir( "d:\\new" )]
>>> for  i in  a:
     print  i

  walk 函数会帮你找出一个目录树下的所有文件. 它的参数依次是目录名, 回调函数, 以及传递给回调函数的数据对象.

使用 os.path 搜索文件系统

import  os
 
def  callback(arg, directory, files):
     for  file  in  files:
         print  os.path.join(directory, file ), repr (arg)
 
os.path.walk( "." , callback, "secret message" )
 
. / aifc - example - 1.py  'secret message'
. / anydbm - example - 1.py  'secret message'
. / array - example - 1.py  'secret message'
...
. / samples 'secret message'
. / samples / sample.jpg 'secret message'
. / samples / sample.txt 'secret message'
. / samples / sample. zip  'secret message'
. / samples / articles 'secret message'
. / samples / articles / article - 1.txt  'secret message'
. / samples / articles / article - 2.txt  'secret message'
...

  index 函数会返回一个文件名列表, 你可以直接使用for-in 循环处理文件.

使用 os.listdir 搜索文件系统

import  os
 
def  index(directory):
     # like os.listdir, but traverses directory trees
     stack =  [directory]
     files =  []
     while  stack:
         directory =  stack.pop()
         for  file  in  os.listdir(directory):
             fullname =  os.path.join(directory, file )
             files.append(fullname)
             if  os.path.isdir(fullname) and  not  os.path.islink(fullname):
                 stack.append(fullname)
     return  files
 
for  file  in  index( "." ):
     print  file
 
.\aifc - example - 1.py
.\anydbm - example - 1.py
.\array - example - 1.py
...

  一次返回一个文件

import  os
 
class  DirectoryWalker:
     # a forward iterator that traverses a directory tree
 
     def  _ _init_ _( self , directory):
         self .stack =  [directory]
         self .files =  []
         self .index =  0
 
     def  _ _getitem_ _( self , index):
         while  1 :
             try :
                 file  =  self .files[ self .index]
                 self .index =  self .index +  1
             except  IndexError:
                 # pop next directory from stack
                 self .directory =  self .stack.pop()
                 self .files =  os.listdir( self .directory)
                 self .index =  0
             else :
                 # got a filename
                 fullname =  os.path.join( self .directory, file )
                 if  os.path.isdir(fullname) and  not  os.path.islink(fullname):
                     self .stack.append(fullname)
                 return  fullname
 
for  file  in  DirectoryWalker( "." ):
     print  file
 
.\aifc - example - 1.py
.\anydbm - example - 1.py
.\array - example - 1.py
...

  注意 DirectoryWalker 类并不检查传递给 _ _getitem_ _ 方法的索引值. 这意味着如果你越界访问序列成员(索引数字过大)的话, 这个类将不能正常工作.

下面这个例子它返回文件名和它的 os.stat 属性(一个元组). 这个版本在每个文件上都能节省一次或两次stat 调用( os.path.isdir 和 os.path.islink 内部都使用了 stat ), 并且在一些平台上运行很快.

使用 DirectoryStatWalker 搜索文件系统

import  os, stat
 
class  DirectoryStatWalker:
     # a forward iterator that traverses a directory tree, and
     # returns the filename and additional file information
 
     def  _ _init_ _( self , directory):
         self .stack =  [directory]
         self .files =  []
         self .index =  0
 
     def  _ _getitem_ _( self , index):
         while  1 :
             try :
                 file  =  self .files[ self .index]
                 self .index =  self .index +  1
             except  IndexError:
                 # pop next directory from stack
                 self .directory =  self .stack.pop()
                 self .files =  os.listdir( self .directory)
                 self .index =  0
             else :
                 # got a filename
                 fullname =  os.path.join( self .directory, file )
                 st =  os.stat(fullname)
                 mode =  st[stat.ST_MODE]
                 if  stat.S_ISDIR(mode) and  not  stat.S_ISLNK(mode):
                     self .stack.append(fullname)
                 return  fullname, st
 
for  file , st in  DirectoryStatWalker( "." ):
     print  file , st[stat.ST_SIZE]
 
.\aifc - example - 1.py  336
.\anydbm - example - 1.py  244
.\array - example - 1.py  526

  

Using the stat Module

import  stat
import  os, time
 
st =  os.stat( "samples/sample.txt" )
 
print  "mode" , "=>" , oct (stat.S_IMODE(st[stat.ST_MODE]))
 
print  "type" , "=>" ,
if  stat.S_ISDIR(st[stat.ST_MODE]):
     print  "DIRECTORY" ,
if  stat.S_ISREG(st[stat.ST_MODE]):
     print  "REGULAR" ,
if  stat.S_ISLNK(st[stat.ST_MODE]):
     print  "LINK" ,
print
 
print  "size" , "=>" , st[stat.ST_SIZE]
 
print  "last accessed" , "=>" , time.ctime(st[stat.ST_ATIME])
print  "last modified" , "=>" , time.ctime(st[stat.ST_MTIME])
print  "inode changed" , "=>" , time.ctime(st[stat.ST_CTIME])
 
mode = > 0664
type  = > REGULAR
size = > 305
last accessed = > Sun Oct  10  22 : 12 : 30  1999
last modified = > Sun Oct  10  18 : 39 : 37  1999
inode changed = > Sun Oct  10  15 : 26 : 38  1999

  

使用 string 模块

import  string
 
text =  "Monty Python's Flying Circus"
 
print  "upper" , "=>" , string.upper(text)
print  "lower" , "=>" , string.lower(text)
print  "split" , "=>" , string.split(text)
print  "join" , "=>" , string.join(string.split(text), "+" )
print  "replace" , "=>" , string.replace(text, "Python" , "Java" )
print  "find" , "=>" , string.find(text, "Python" ), string.find(text, "Java" )
print  "count" , "=>" , string.count(text, "n" )
 
upper = > MONTY PYTHON'S FLYING CIRCUS
lower = > monty python's flying circus
split = > [ 'Monty' , "Python's" , 'Flying ', ' Circus']
join = > Monty + Python's + Flying + Circus
replace = > Monty Java's Flying Circus
find = > 6  - 1
count = > 3

  

使用字符串方法替代 string 模块函数

text =  "Monty Python's Flying Circus"
 
print  "upper" , "=>" , text.upper()
print  "lower" , "=>" , text.lower()
print  "split" , "=>" , text.split()
print  "join" , "=>" , "+" .join(text.split())
print  "replace" , "=>" , text.replace( "Python" , "Perl" )
print  "find" , "=>" , text.find( "Python" ), text.find( "Perl" )
print  "count" , "=>" , text.count( "n" )
 
upper = > MONTY PYTHON'S FLYING CIRCUS
lower = > monty python's flying circus
split = > [ 'Monty' , "Python's" , 'Flying ', ' Circus']
join = > Monty + Python's + Flying + Circus
replace = > Monty Perl's Flying Circus
find = > 6  - 1
count = > 3

  

使用 string 模块将字符串转为数字

import  string
 
print  int ( "4711" ),
print  string.atoi( "4711" ),
print  string.atoi( "11147" , 8 ), # octal 八进制
print  string.atoi( "1267" , 16 ), # hexadecimal 十六进制
print  string.atoi( "3mv" , 36 ) # whatever...
 
print  string.atoi( "4711" , 0 ),
print  string.atoi( "04711" , 0 ),
print  string.atoi( "0x4711" , 0 )
 
print  float ( "4711" ),
print  string.atof( "1" ),
print  string.atof( "1.23e5" )
 
4711  4711  4711  4711  4711
4711  2505  18193
4711.0  1.0  123000.0

  operator 模块为 Python 提供了一个 "功能性" 的标准操作符接口. 当使用 map 以及 filter 一类的函数的时候, operator 模块中的函数可以替换一些lambda 函式. 而且这些函数在一些喜欢写晦涩代码的程序员中很流行.

使用 operator 模块

print  "add" , "=>" , reduce (operator.add, sequence)
print  "sub" , "=>" , reduce (operator.sub, sequence)
print  "mul" , "=>" , reduce (operator.mul, sequence)
print  "concat" , "=>" , operator.concat( "spam" , "egg" )
print  "repeat" , "=>" , operator.repeat( "spam" , 5 )
print  "getitem" , "=>" , operator.getitem(sequence, 2 )
print  "indexOf" , "=>" , operator.indexOf(sequence, 2 )
print  "sequenceIncludes" , "=>" , operator.sequenceIncludes(sequence, 3 )
 
add = > 7
sub = > - 5
mul = > 8
concat = > spamegg
repeat = > spamspamspamspamspam
 
getitem = > 4
indexOf = > 1
sequenceIncludes = > 0

  

使用 operator 模块检查类型

import  operator
import  UserList
 
def  dump(data):
     print  type (data), "=>" ,
     if  operator.isCallable(data):
         print  "CALLABLE" ,
     if  operator.isMappingType(data):
         print  "MAPPING" ,
     if  operator.isNumberType(data):
         print  "NUMBER" ,
     if  operator.isSequenceType(data):
         print  "SEQUENCE" ,
     print
         
dump( 0 )
dump( "string" )
dump( "string" [ 0 ])
dump([ 1 , 2 , 3 ])
dump(( 1 , 2 , 3 ))
dump({ "a" : 1 })
dump( len ) # function 函数
dump(UserList) # module 模块
dump(UserList.UserList) # class 类
dump(UserList.UserList()) # instance 实例
 
< type  'int' > = > NUMBER
< type  'string' > = > SEQUENCE
< type  'string' > = > SEQUENCE
< type  'list' > = > SEQUENCE
< type  'tuple' > = > SEQUENCE
< type  'dictionary' > = > MAPPING
< type  'builtin_function_or_method' > = > CALLABLE
< type  'module' > = >
< type  'class' > = > CALLABLE
< type  'instance' > = > MAPPING NUMBER SEQUENCE

  copy 模块包含两个函数, 用来拷贝对象

使用 copy 模块复制对象

 

import  copy
 
a =  [[ 1 ],[ 2 ],[ 3 ]]
b =  copy.copy(a)
 
print  "before" , "=>"
print  a
print  b
 
# modify original
a[ 0 ][ 0 ] =  0
a[ 1 ] =  None
 
print  "after" , "=>"
print  a
print  b
 
before = >
[[ 1 ], [ 2 ], [ 3 ]]
[[ 1 ], [ 2 ], [ 3 ]]
after = >
[[ 0 ], None , [ 3 ]]
[[ 0 ], [ 2 ], [ 3 ]]

  

使用 copy 模块复制集合(Collections)

import  copy
 
a =  [[ 1 ],[ 2 ],[ 3 ]]
b =  copy.deepcopy(a)
 
print  "before" , "=>"
print  a
print  b
 
# modify original
a[ 0 ][ 0 ] =  0
a[ 1 ] =  None
 
print  "after" , "=>"
print  a
print  b
 
before = >
[[ 1 ], [ 2 ], [ 3 ]]
[[ 1 ], [ 2 ], [ 3 ]]
after = >
[[ 0 ], None , [ 3 ]]
[[ 1 ], [ 2 ], [ 3 ]]

 使用sys模块获得脚本的参数

import  sys
 
print  "script name is" , sys.argv[ 0 ]
 
if  len (sys.argv) > 1 :
     print  "there are" , len (sys.argv) - 1 , "arguments:"
     for  arg in  sys.argv[ 1 :]:
         print  arg
else :
     print  "there are no arguments!"
 
script name is  sys - argv - example - 1.py
there are no arguments!

  

使用sys模块操作模块搜索路径

import  sys
 
print  "path has" , len (sys.path), "members"
 
# add the sample directory to the path
sys.path.insert( 0 , "samples" )
import  sample
 
# nuke the path
sys.path =  []
import  random # oops!
 
path has 7  members
this is  the sample module!
Traceback (innermost last):
   File  "sys-path-example-1.py" , line 11 , in  ?
     import  random # oops!
ImportError: No module named random

  

使用sys模块查找内建模块

import  sys
 
def  dump(module):
     print  module, "=>" ,
     if  module in  sys.builtin_module_names:
         print  "<BUILTIN>"
     else :
         module =  _ _import_ _(module)
         print  module._ _file_ _
 
dump( "os" )
dump( "sys" )
dump( "string" )
dump( "strop" )
dump( "zlib" )
 
os = > C:\python\lib\os.pyc
sys = > <BUILTIN>
string = > C:\python\lib\string.pyc
strop = > <BUILTIN>
zlib = > C:\python\zlib.pyd

  

使用sys模块查找已导入的模块

modules 字典包含所有加载的模块. import 语句在从磁盘导入内容之前会先检查这个字典.

import  sys
 
print  sys.modules.keys()
 
[ 'os.path' , 'os' , 'exceptions' , '_ _main_ _' , 'ntpath' , 'strop' , 'nt' ,
'sys' , '_ _builtin_ _' , 'site' , 'signal' , 'UserDict' , 'string' , 'stat' ]

  getrefcount 函数 返回给定对象的引用记数 - 也就是这个对象使用次数. Python 会跟踪这个值, 当它减少为0的时候, 就销毁这个对象.

使用sys模块获得引用记数

import  sys
 
variable =  1234
 
print  sys.getrefcount( 0 )
print  sys.getrefcount(variable)
print  sys.getrefcount( None )
 
50
3
192

  注意这个值总是比实际的数量大, 因为该函数本身在确定这个值的时候依赖这个对象

使用sys模块获得当前平台

import  sys
 
#
# emulate "import os.path" (sort of)...
 
if  sys.platform = =  "win32" :
     import  ntpath
     pathmodule =  ntpath
elif  sys.platform = =  "mac" :
     import  macpath
     pathmodule =  macpath
else :
     # assume it's a posix platform
     import  posixpath
     pathmodule =  posixpath
 
print  pathmodule

  setprofiler 函数允许你配置一个分析函数(profiling function). 这个函数会在每次调用某个函数或方法时被调用(明确或隐含的), 或是遇到异常的时候被调用. 

使用sys模块配置分析函数

import  sys
 
def  test(n):
     j =  0
     for  i in  range (n):
         j =  j +  i
     return  n
 
def  profiler(frame, event, arg):
     print  event, frame.f_code.co_name, frame.f_lineno, "->" , arg
 
# profiler is activated on the next call, return, or exception
# 分析函数将在下次函数调用, 返回, 或异常时激活
sys.setprofile(profiler)
 
# profile this function call
# 分析这次函数调用
test( 1 )
 
# disable profiler
# 禁用分析函数
sys.setprofile( None )
 
# don't profile this call
# 不会分析这次函数调用
test( 2 )
 
call test 3  - > None
return  test 7  - > 1

  

使用sys模块配置单步跟踪函数

import  sys
 
def  test(n):
     j =  0
     for  i in  range (n):
         j =  j +  i
     return  n
 
def  tracer(frame, event, arg):
     print  event, frame.f_code.co_name, frame.f_lineno, "->" , arg
     return  tracer
 
# tracer is activated on the next call, return, or exception
# 跟踪器将在下次函数调用, 返回, 或异常时激活
sys.settrace(tracer)
 
# trace this function call
# 跟踪这次函数调用
test( 1 )
 
# disable tracing
# 禁用跟踪器
sys.settrace( None )
 
# don't trace this call
# 不会跟踪这次函数调用
test( 2 )
 
call test 3  - > None
line test 3  - > None
line test 4  - > None
line test 5  - > None
line test 5  - > None
line test 6  - > None
line test 5  - > None
line test 7  - > None
return  test 7  - > 1
目录
相关文章
|
7月前
|
JSON 数据格式 Python
列出5个常用的Python标准库及其功能。
列出5个常用的Python标准库及其功能。
141 0
|
Unix Shell 索引
Python标准库1
Python标准库
147 0
|
6月前
|
JSON Shell API
Python标准库中有哪些好用的模块
在命令行中使用Python标准库模块,如`http.server`、`gzip`、`base64`、`json.tool`和`calendar`,可以直接通过`python -m module_name`调用,无需额外编写代码。例如,`python -m http.server`启动一个简单的HTTP服务器,`python -m gzip -d file.gz`解压缩文件。`json.tool`用于美化显示JSON数据,而`calendar`模块则能输出日历信息。这些在临时需要相关功能时特别方便。
|
7月前
|
机器学习/深度学习 数据处理 算法框架/工具
Python标准库与第三方库:强大的编程资源
Python标准库与第三方库:强大的编程资源
115 1
|
7月前
|
存储 编解码 Python
初出茅庐,python模块篇:pickle模块和pathlib模块(太过详细,篇幅较长)_python文件操作模块有pickle模块
初出茅庐,python模块篇:pickle模块和pathlib模块(太过详细,篇幅较长)_python文件操作模块有pickle模块
|
7月前
|
JSON 算法 测试技术
Python标准库
Python标准库
|
7月前
|
JSON 数据格式 开发者
Python标准库知识问答:面试必备
【4月更文挑战第14天】本文探讨了Python标准库的重要性,并概述了核心模块,如os、sys、datetime等。强调了面试中常见的问题和易错点,例如os模块的文件操作竞态条件、datetime格式化错误、collections.defaultdict误用、json序列化陷阱和logging配置误区。建议通过理解模块功能、避免易错点和实践最佳做法来提升面试表现。
68 0
|
7月前
|
JSON 数据库 数据格式
Python标准库中的常用模块介绍与使用技巧
Python标准库中的常用模块介绍与使用技巧
|
XML Unix 开发工具
【Python标准库】Python标准库索引
【Python标准库】Python标准库索引
|
XML 编解码 JSON
初探Python标准库~【八个自带模块的妙用】
初探Python标准库~【八个自带模块的妙用】
110 0