zoukankan      html  css  js  c++  java
  • Python glob.md

    glob

    即使glob API非常简单, 但这个模块包含了很多的功能. 在很多情况下, 尤其是你的程序需要寻找出文件系统中, 文件名匹配特定模式的文件时, 是非常有用的. 如果你需要包含一个特定扩展名, 或前缀, 或含有任何普通字符串的文件列表, 可以直接使用glob代替手工编程扫描目录内容.
    glob中模式规则不是正则表达式, 而是, 符合标准Uinx路径扩展规则. 但是Shell变量名和符号(~)是不被扩充的, 只有一些特殊的字符: 两个不同的通配符和字母范围被支持. 模块规则适合于文件名的片段(以/为分隔), 但模式中的路径可以是相对或者绝对路径.

    Example Data

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

    # tree .
    .
    └── dir
        ├── file1.txt
        ├── file2.txt
        ├── filea.txt
        ├── fileb.txt
        ├── file?.txt
        ├── file.txt
        ├── file[.txt
        ├── file*.txt
        └── subdir
            └── subfile.txt
    
    2 directories, 9 files
    

    Wildcards

    glob.glob(pathname, *, recursive=False):返回一个与pathname匹配的路径组成的list,该list可能为空。 该参数必须为包含路径说明的字符串。pathname 可以为绝对路径 (like /usr/src/Python-1.5/Makefile) 或相对路径 (like ../../Tools/*/*.gif), 并且可以包含shell风格的通配符。损坏的符号链接将被包含在结果中 (类似于shell中)。如果 recursive 设置为真,“**” 将匹配所有存在的目录和子目录和任何文件。如果匹配式以 os.sep 结尾, 只对目录和子目录进行匹配。

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

    import glob
    
    for name in sorted(glob.glob('dir/*')):
        print(name)
    

    该模式在目录中匹配每个路径名(文件或目录),而不需要进一步递归到子目录中。glob()返回的数据没有排序,因此这里的示例对它进行排序,以便更容易地研究结果。

    # python glob_study.py
    dir/file*.txt
    dir/file.txt
    dir/file1.txt
    dir/file2.txt
    dir/file?.txt
    dir/file[.txt
    dir/filea.txt
    dir/fileb.txt
    dir/subdir
    

    要在子目录中列出文件,必须将子目录包含在模式中。

    import glob
    
    print('Named explicitly:')
    for name in sorted(glob.glob('dir/subdir/*')):
        print('  {}'.format(name))
    
    print('Named with wildcard:')
    for name in sorted(glob.glob('dir/*/*')):
        print('  {}'.format(name))
    

    上面显示的第一种情况显式列出子目录名称,而第二种情况则依赖通配符来查找目录。

    Named explicitly:
      dir/subdir/subfile.txt
    Named with wildcard:
      dir/subdir/subfile.txt
    

    在这种情况下,结果是一样的。如果有另一个子目录,通配符将匹配两个子目录,并包含两个子目录中的文件名。

    Single Character Wildcard

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

    import glob
    
    for name in sorted(glob.glob('dir/file?.txt')):
        print(name)
    

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

    dir/file*.txt
    dir/file1.txt
    dir/file2.txt
    dir/file?.txt
    dir/file[.txt
    dir/filea.txt
    dir/fileb.txt
    

    Character Ranges

    使用一个字符范围(a-z)而不是一个问号来匹配几个字符中的一个。此示例在扩展名之前查找名称中具有数字的所有文件。

    import glob
    
    for name in sorted(glob.glob('dir/*[0-9].*')):
        print(name)
    

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

    dir/file1.txt
    dir/file2.txt
    

    Escaping Meta-characters

    glob.escape(pathname):转义所有的特殊字符('?','*'和'['])。如果您想匹配任意可能包含特殊字符的字符串,这将非常有用。驱动器/ UNC共享点中的特殊字符不会转义,例如在Windows系统上 escape('//?/c:/Quo vadis?.txt') 将返回 '//?/c:/Quo vadis[?].txt'。

    举例
    有时需要搜索包含特殊元字符的名称的文件,这些名称包含了其模式的特殊元字符。escape()函数构建了一个适当的模式,其中特殊字符“escaped”,因此它们不会被glob扩展或解释为特殊字符。

    import glob
    
    specials = '?*['
    
    for char in specials:
        pattern = 'dir/*' + glob.escape(char) + '.txt'
        print('Searching for:  {!r}'.format(pattern))
        for name in sorted(glob.glob(pattern)):
            print(name)
        print()
    

    每个特殊字符通过构建包含单个条目的字符范围来转义。

    Searching for:  'dir/*[?].txt'
    dir/file?.txt
    
    Searching for:  'dir/*[*].txt'
    dir/file*.txt
    
    Searching for:  'dir/*[[].txt'
    dir/file[.txt
    
    
  • 相关阅读:
    图论
    城市吸引力指数
    bzoj3529(莫比乌斯反演+离线+树状数组)
    强制关闭tomcat
    bzoj2154(莫比乌斯反演)
    等差数列求和模板
    联想的显示屏校准(困难)
    bzoj2301(莫比乌斯反演)
    莫比乌斯反演模版
    菜鸟物流的运输网络(网络流)
  • 原文地址:https://www.cnblogs.com/cuchadanfan/p/7153369.html
Copyright © 2011-2022 走看看