python标准库实例详解六 python标准库常用函数

发布时间:2020-07-04编辑:脚本学堂
本节是python标准库实例学习的第六节,学习下python标准库常用函数的用法,有需要的朋友参考下。
使用 os 列出目录下的文件
 

复制代码 代码示例:
import os
 
for file in os.listdir("samples"):
    print file
 
sample.au
sample.jpg
sample.wav
...
 

  getcwd 和 chdir 函数分别用于获得和改变当前工作目录
 使用 os 模块改变当前工作目录
 

复制代码 代码示例:
import os
 
# where are we?
cwd = os.getcwd()
print "1", cwd
 
# go down
os.chdir("samples")
print "2", os.getcwd()
 
# go back up
os.chdir(os.pardir)
print "3", os.getcwd()
 
1 /ematter/librarybook
2 /ematter/librarybook/samples
3 /ematter/librarybook
 

  makedirs 和 removedirs 函数用于创建或删除目录层
使用 os 模块创建/删除多个目录级
 

复制代码 代码示例:
import os
 
os.makedirs("test/multiple/levels")
 
fp = open("test/multiple/levels/file", "w")
fp.write("inspector praline")
fp.close()
 
# remove the file
os.remove("test/multiple/levels/file")
 
# and all empty directories above it
os.removedirs("test/multiple/levels")
 

  removedirs 函数会删除所给路径中最后一个目录下所有的空目录. 而 mkdir 和 rmdir 函数只能处理单个目录级
使用 os 模块创建/删除目录
 

复制代码 代码示例:
import os
 
os.mkdir("test")
os.rmdir("test")
 
os.rmdir("samples") # this will fail
 
Traceback (innermost last):
  File "os-example-7", line 6, in ?
OSError: [Errno 41] Directory not empty: 'samples'
 

  如果需要删除非空目录, 你可以使用 shutil 模块中的 rmtree 函数
 

复制代码 代码示例:
>>> import shutil
shutil.rmtree("d:a")
  复制文件目录(包括内部文件)
>>> shutil.copytree("d:new","d:a")
  复制文件操作:
shutil.copyfile("d:newa.txt","d:a.txt")
  目录或文件的移动操作
shutil.move("d:newa.txt","d:")
 

使用os模块获取文件属性
 

复制代码 代码示例:
import os
import time
 
file = "samples/sample.jpg"
 
def dump(st):
    mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = st
    print "- size:", size, "bytes"
    print "- owner:", uid, gid
    print "- created:", time.ctime(ctime)
    print "- last accessed:", time.ctime(atime)
    print "- last modified:", time.ctime(mtime)
    print "- mode:", oct(mode)
    print "- inode/dev:", ino, dev
 
#
# get stats for a filename
 
st = os.stat(file)
 
print "stat", file
dump(st)
print
 
#
# get stats for an open file
 
fp = open(file)
 
st = os.fstat(fp.fileno())
 
print "fstat", file
dump(st)
 
stat samples/sample.jpg
- size: 4762 bytes
- owner: 0 0
- created: Tue Sep 07 22:45:58 1999
- last accessed: Sun Sep 19 00:00:00 1999
- last modified: Sun May 19 01:42:16 1996
- mode: 0100666
- inode/dev: 0 2
 
fstat samples/sample.jpg
- size: 4762 bytes
- owner: 0 0
- created: Tue Sep 07 22:45:58 1999
- last accessed: Sun Sep 19 00:00:00 1999
- last modified: Sun May 19 01:42:16 1996
- mode: 0100666
- inode/dev: 0 0
 

  可以使用 chmod 和 utime 函数修改文件的权限模式和时间属性
使用 os 模块修改文件的权限和时间戳
 

复制代码 代码示例:
import os
import stat, time
 
infile = "samples/sample.jpg"
outfile = "out.jpg"
 
# copy contents
fi = open(infile, "rb")
fo = open(outfile, "wb")
 
while 1:
    s = fi.read(10000)
    if not s:
        break
    fo.write(s)
 
fi.close()
fo.close()
 
# copy mode and timestamp
st = os.stat(infile)
os.chmod(outfile, stat.S_IMODE(st[stat.ST_MODE]))
os.utime(outfile, (st[stat.ST_ATIME], st[stat.ST_MTIME]))
 
print "original", "=>"
print "mode", oct(stat.S_IMODE(st[stat.ST_MODE]))
print "atime", time.ctime(st[stat.ST_ATIME])
print "mtime", time.ctime(st[stat.ST_MTIME])
 
print "copy", "=>"
st = os.stat(outfile)
print "mode", oct(stat.S_IMODE(st[stat.ST_MODE]))
print "atime", time.ctime(st[stat.ST_ATIME])
print "mtime", time.ctime(st[stat.ST_MTIME])
 
original =>
mode 0666
atime Thu Oct 14 15:15:50 1999
mtime Mon Nov 13 15:42:36 1995
copy =>
mode 0666
atime Thu Oct 14 15:15:50 1999
mtime Mon Nov 13 15:42:36 1995
 

  system 函数在当前进程下执行一个新命令, 并等待它完成
使用 os 执行操作系统命令
 

复制代码 代码示例:
import os
 
if os.name == "nt":
    command = "dir"
else:
    command = "ls -l"
 
os.system(command)
 
-rwxrw-r--   1 effbot  effbot        76 Oct  9 14:17 README
-rwxrw-r--   1 effbot  effbot      1727 Oct  7 19:00 SimpleAsyncHTTP.py
-rwxrw-r--   1 effbot  effbot       314 Oct  7 20:29 aifc-example-1.py
-rwxrw-r--   1 effbot  effbot       259 Oct  7 20:38 anydbm-example-1.py
...
 

命令通过操作系统的标准 shell 执行, 并返回 shell 的退出状态. 需要注意的是在 Windows 下, shell 通常是 command.com , 它的推出状态总是 0.
exec 函数会使用新进程替换当前进程(或者说是"转到进程").
使用 os 模块启动新进程
 

复制代码 代码示例:
import os
import sys
 
program = "python"
arguments = ["hello.py"]
 
print os.execvp(program, (program,) +  tuple(arguments))
print "goodbye"
 
hello again, and welcome to the show
 

  execvp 函数, 它会从标准路径搜索执行程序, 把第二个参数(元组)作为单独的参数传递给程序, 并使用当前的环境变量来运行程序. 其他七个同类型函数请参阅 Python Library Reference .
在 Unix 环境下, 你可以通过组合使用 exec , fork 以及 wait 函数来从当前程序调用另一个程序,fork 函数复制当前进程, wait 函数会等待一个子进程执行结束.
 使用 os 模块调用其他程序 (Unix)
 

复制代码 代码示例:
import os
import sys
 
def run(program, *args):
    pid = os.fork()
    if not pid:
        os.execvp(program, (program,) +  args)
    return os.wait()[0]
 
run("python", "hello.py")
 
print "goodbye"
 
hello again, and welcome to the show
goodbye
 

fork 函数在子进程返回中返回 0 (这个进程首先从 fork 返回值), 在父进程中返回一个非 0 的进程标识符(子进程的 PID ). 也就是说, 只有当我们处于子进程的时候 "not pid" 才为真.
fork 和 wait 函数在 Windows 上是不可用的, 但是你可以使用 spawn 函数不过, spawn 不会沿着路径搜索可执行文件, 你必须自己处理好这些.
或许系统当前的“PATH”变量的值
 

复制代码 代码示例:
>>> import string
>>>import os
>>> for path in string.split(os.environ["PATH"],os.pathsep):
    print path
 
    
C:Program FilesNVIDIA CorporationPhysXCommon
d:program filesPython27Libsite-packagesPyQt4
C:windowssystem32
C:windows
C:windowsSystem32Wbem
C:windowsSystem32Windowspowershellv1.0
C:Program FilesCommon FilesThunder NetworkKanKanCodecs
D:Program Filespython
D:Program FilesJavajdk1.6.0_23/bin
D:Program FilesJavajdk1.6.0_23/jre/bin
C:Program FilesMicrosoft SQL Server90Toolsbinn
D:vs2010-qt-src-4.7.4qt-src-4.7.4bin
C:Program FilesIntelwifibin
C:Program FilesCommon FilesIntelWirelessCommon
C:Program FilesLenovoBluetooth Software
D:vs2010-qt-src-4.7.4qt-src-4.7.4bin
D:vs2010-qt-src-4.7.4qt-src-4.7.4lib
D:vs2010-qt-src-4.7.4qt-src-4.7.4include
D:Qt4.7.4bin
>>>
  
 

使用 os 模块调用其他程序 (Windows)
 

复制代码 代码示例:
import os
import string
 
def run(program, *args):
    # find executable
    for path in string.split(os.environ["PATH"], os.pathsep):
        file = os.path.join(path, program) + ".exe"
        try:
            return os.spawnv(os.P_WAIT, file, (file,) + args)
        except os.error:
            pass
    raise os.error, "cannot find executable"
 
run("python", "hello.py")
 
print "goodbye"
 
hello again, and welcome to the show
goodbye
 

  spawn 函数还可用于在后台运行一个程序.下面这个例子给 run 函数添加了一个可选的 mode 参数; 当设置为 os.P_NOWAIT 时, 这个脚本不会等待子程序结束, 默认值 os.P_WAIT 时 spawn 会等待子进程结束.
其它的标志常量还有 os.P_OVERLAY ,它使得 spawn 的行为和 exec 类似, 以及 os.P_DETACH , 它在后台运行子进程, 与当前控制台和键盘焦点隔离.
 

复制代码 代码示例:
import os
import string
 
def run(program, *args, **kw):
    # find executable
    mode = kw.get("mode", os.P_WAIT)
    for path in string.split(os.environ["PATH"], os.pathsep):
        file = os.path.join(path, program) + ".exe"
        try:
            return os.spawnv(mode, file, (file,) + args)
        except os.error:
            pass
    raise os.error, "cannot find executable"
 
run("python", "hello.py", mode=os.P_NOWAIT)
print "goodbye"
 
goodbye
hello again, and welcome to the show

下面这个例子提供了一个在 Unix 和 Windows 平台上通用的 spawn 方法
使用 spawn 或 fork/exec 调用其他程序
 

复制代码 代码示例:
import os
import string
 
if os.name in ("nt", "dos"):
    exefile = ".exe"
else:
    exefile = ""
 
def spawn(program, *args):
    try:
        # possible 2.0 shortcut!
        return os.spawnvp(program, (program,) + args)
    except AttributeError:
        pass
    try:
        spawnv = os.spawnv
    except AttributeError:
 
        # assume it's unix
        pid = os.fork()
        if not pid:
            os.execvp(program, (program,) + args)
        return os.wait()[0]
    else:
        # got spawnv but no spawnp: go look for an executable
        for path in string.split(os.environ["PATH"], os.pathsep):
            file = os.path.join(path, program) + exefile
            try:
                return spawnv(os.P_WAIT, file, (file,) + args)
            except os.error:
                pass
        raise IOError, "cannot find executable"
 
#
# try it out!
 
spawn("python", "hello.py")
 
print "goodbye"
 
hello again, and welcome to the show
goodbye
 

处理守护进程
Unix 系统中, 你可以使用 fork 函数把当前进程转入后台(一个"守护者/daemon"). 一般来说, 你需要派生(fork off)一个当前进程的副本, 然后终止原进程
使用 os 模块使脚本作为守护执行 (Unix)
 

复制代码 代码示例:
import os
import time
 
pid = os.fork()
if pid:
    os._exit(0) # kill original
 
print "daemon started"
time.sleep(10)
print "daemon terminated"
 

使用 os 模块终止当前进程
 

复制代码 代码示例:
import os
import sys
 
try:
    sys.exit(1)
except SystemExit, value:
    print "caught exit(%s)" % value
 
try:
    os._exit(2)
except SystemExit, value:
    print "caught exit(%s)" % value
 
print "bye!"
 
caught exit(1)