Table Of Contents

Previous topic

PyMOTW: pickle & cPickle

Next topic

PyMOTW: shelve

This Page

PyMOTW: glob

  • 模块: glob
  • 目的: 使用Unix Shell规则来寻找文件名匹配某一模式的文件.
  • python版本: 1.4+

描述

即使glob API非常简单, 但这个模块具有强大的力量. 在很多情况下, 尤其是你的程序需要寻找出文件系统中, 文件名匹配特定模式的文件时, 是非常有用的. 如果你需要包含一个特定扩展名, 或前缀, 或含有任何普通字符串的文件列表, 可以直接使用glob代替手工编程扫描目录内容.

glob中模式规则不是正则表达式, 而是, 符合标准Uinx路径扩展规则. 但是Shell变量名和符号(~)是不被扩充的, 只有一些特殊的字符: 两个不同的通配符和字母范围被支持. 模块规则适合于文件名的片段(以/为分隔), 但模式中的路径可以是相对或者绝对路径.

示例数据

假设当前工作目录下包含有以下一些文件.

dir/
dir/file.txt
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt
dir/subdir/
dir/subdir/subfile.txt

使用glob_maketestdata.py脚本可以创建这些文件.

通配符

* 匹配名字片段中的0个或多个字符, 例如, dir/* .

import glob
print glob.glob('dir/*')

这个模式匹配在目录dir中的任何文件或子目录, 但没有进一步递归匹配子目录.

$ python glob_asterisk.py
['dir/file.txt', 'dir/file1.txt', 'dir/file2.txt',
'dir/filea.txt', 'dir/fileb.txt', 'dir/subdir']

如果要列出子目录中的文件, 你应该在模式中包含相应子目录:

print 'Named explicitly:'
print glob.glob('dir/subdir/*')

print 'Named with wildcard:'
print glob.glob('dir/*/*')

上面的第一个例子直接列出了指定子目录名的文件, 而第二个例子则依赖于通配符来寻找子目录.

$ python glob_subdir.py
Named explicitly:
['dir/subdir/subfile.txt']
Named with wildcard:
['dir/subdir/subfile.txt']

在这个例子中, 结果是一样的. 如果还有其他的子目录, 那么, 通配符匹配所有子目录及其他们中包含的文件.

单一字符通配符

其他的被支持的通配符是问号(?). 它匹配在对应位置的任一单个字符. 例如:

print glob.glob('dir/file?.txt')

匹配所有以”file”开头, 之后包含一个任何字符并以”.txt”结尾的文件.

$ python glob_question.py
['dir/file1.txt', 'dir/file2.txt',
'dir/filea.txt', 'dir/fileb.txt']

字符范围

当你需要匹配一个特定字符时, 可以使用一个字符范围来替代问号. 例如, 为了找到所有文件名中在扩展名之前包含数字的文件时:

print glob.glob('dir/*[0-9].*')

字符范围[0-9]匹配任何单一数字. 这个范围是基于每个字符/数字的字符编码顺序, 破折号(-)表示一个范围, 上面的范围也可直接用[0123456789]来表示.

$ python glob_charrange.py
['dir/file1.txt', 'dir/file2.txt']