PyMOTW: glob
优质
小牛编辑
126浏览
2023-12-01
- 模块: 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']