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('*')
。