📜  fnmatch – Python中的 Unix 文件名模式匹配(1)

📅  最后修改于: 2023-12-03 15:00:49.318000             🧑  作者: Mango

fnmatch – Python中的 Unix 文件名模式匹配

Python提供了fnmatch模块,其中包含了一些用于文件名比较的函数,这些函数可以非常方便地将文件名与模式进行匹配,类似于Unix shell的文件名模式匹配。

基本用法

fnmatch模块中最常用的函数是fnmatch(),它采用两个参数:文件名和模式字符串。

import fnmatch

file_name = 'example.txt'
pattern = '*.txt'

if fnmatch.fnmatch(file_name, pattern):
    print('文件名与模式相匹配')
else:
    print('文件名与模式不匹配')

上面的代码会输出文件名与模式相匹配,因为该文件名符合指定的模式。

fnmatch()还支持在模式字符串中使用特殊字符来匹配不同类型的字符:

  • *: 匹配任意数量的任意字符
  • ?: 匹配单个任意字符
  • [seq]: 匹配任意出现在seq中的字符
  • [!seq]: 匹配任意未出现在seq中的字符

例如:

file_name = 'foo.py'
if fnmatch.fnmatch(file_name, '*.py'):
    print('Python文件')

file_name = 'bar.pyd'
if fnmatch.fnmatch(file_name, '*.py?'):
    print('Python文件')

file_name = 'README.txt'
if fnmatch.fnmatch(file_name, '[Rr][Ee][Aa][Dd][Mm][Ee].[Tt]*'):
    print('README文件')

file_name = 'example.html'
if fnmatch.fnmatch(file_name, '!*.txt'):
    print('非文本文件')
高级用法

除了基本用法外,fnmatch模块还提供了以下函数:

fnmatchcase()

fnmatch()类似,但区分大小写。

filter()

使用指定的模式过滤列表中的文件名(或其他字符串)。

import os
import fnmatch

files = os.listdir('.')
for name in fnmatch.filter(files, '*.py'):
    print(name)

上面的代码将列出当前目录中所有以.py结尾的文件名。

translate()

将模式字符串转换为正则表达式字符串。这在需要进行更复杂的文件名匹配时很有用。

import fnmatch

pattern = 'log-[0-9]*[0-9].txt'
regex = fnmatch.translate(pattern)
print('模式:', pattern)
print('正则表达式:', regex)

上面的代码将打印出匹配以log-开头、后面跟1到99的数字、以.txt结尾的文件名的正则表达式。

总结

fnmatch模块为Python开发者提供了一种快速、简单的方法来过滤和匹配文件名。它非常类似于Unix shell的文件名模式匹配。除了基本的fnmatch()函数外,它还提供了其他函数,如fnmatchcase()filter()translate(),以实现更复杂的文件名匹配需求。