当前位置:嗨网首页>书籍在线阅读

12-使用通配符模式修改文件列表

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.1.10 使用通配符模式修改文件列表

如果要处理特定文件,那么使用 glob() 方法比 listdir() 更简单。 Path 对象具有 glob() 方法,用于根据“通配符( glob )模式”列出文件夹的内容。通配符模式类似于命令行命令中经常使用的正则表达式的简化形式。 glob() 方法返回一个生成器对象(这不在本书的讨论范围内),你需要将它传递给 list() ,以便在交互式环境中轻松查看:

>>> p = Path('C:/Users/Al/Desktop')
>>> p.glob('*')
<generator object Path.glob at 0x000002A6E389DED0>
>>> list(p.glob('*')) # Make a list from the generator.
    [WindowsPath('C:/Users/Al/Desktop/1.png'),WindowsPath('C:/Users/Al/ Desktop/22-ap.pdf'), 
    WindowsPath('C:/Users/Al/Desktop/cat.jpg'),
  --snip--
WindowsPath('C:/Users/Al/Desktop/zzz.txt')]

星号 (*) 代表“多个任意字符”,因此 p.glob('*' )返回一个生成器对象,代表存储在 p 中的路径中的所有文件。

与正则表达式一样,你可以创建复杂的表达式:

>>> list(p.glob('*.txt')# Lists all text files.
[WindowsPath('C:/Users/Al/Desktop/foo.txt'),
  --snip--
WindowsPath('C:/Users/Al/Desktop/zzz.txt')]

通配符模式 '*.txt' 返回以任何字符组合开头、以字符串 '.txt' (即文本文件扩展名)结尾的文件。

与星号不同,问号( ? )代表任意单个字符:

>>> list(p.glob('project?.docx')
[WindowsPath('C:/Users/Al/Desktop/project1.docx'), WindowsPath('C:/Users/Al/
Desktop/project2.docx'),
  --snip--
WindowsPath('C:/Users/Al/Desktop/project9.docx')]

通配符表达式 'project?.docx' 将返回 'project1.docx''project5. docx' ,但不会返回 'project10.docx' ,因为 ? 只匹配一个字符,所以不匹配两个字符的字符串 '10'

最后,你还可以结合使用星号和问号来创建更复杂的通配符表达式,如下所示:

>>> list(p.glob('*.?x?')
[WindowsPath('C:/Users/Al/Desktop/calc.exe'), WindowsPath('C:/Users/Al/ 
Desktop/foo.txt'),
--snip--
WindowsPath('C:/Users/Al/Desktop/zzz.txt')]

通配符表达式 '*.?x?' 将返回具有任意名称和任意3个字符的扩展名的文件,但扩展名的中间字符必须为 'x'

通过选择具有特定属性的文件, glob() 方法让你能够轻松地在目录中指定一些文件,并对其执行某些操作。可以用 for 循环遍历 glob() 返回的生成器对象:

>>> p = Path('C:/Users/Al/Desktop')
>>> for textFilePathObj in p.glob('*.txt'):
...    print(textFilePathObj) # Prints the Path object as a string.
...    # Do something with the text file.
...
C:\Users\Al\Desktop\foo.txt
C:\Users\Al\Desktop\spam.txt
C:\Users\Al\Desktop\zzz.txt

如果要对目录中的每个文件执行某些操作,则可以使用 os.listdir(p)p.glob('*')