python标准库实例详解七

发布时间:2020-06-07编辑:脚本学堂
本节是python标准库实例教程的第七节,学习并掌握下python文件与目录模块,以及字符串模块的用法,有需要的朋友参考下。

本节内容:
pythonbiaozhunku/ target=_blank class=infotextkey>python标准库中目录、文件、字符串等模块的用法。

使用 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/littlepony

当前目录和上一级目录
>>> 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.islinuxjishu/9952.html target=_blank class=infotextkey>mount(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