每週一個 Python 模組 | fnmatch

yongxinz發表於2019-02-18

專欄地址:每週一個 Python 模組

fnmatch 模組主要用於檔名的比較,使用 Unix shell 使用的 glob 樣式模式。

簡單匹配

fnmatch() 將單個檔名與模式進行比較並返回布林值,來看它們是否匹配。當作業系統使用區分大小寫的檔案系統時,比較區分大小寫。

import fnmatch
import os

pattern = 'fnmatch_*.py'
print('Pattern :', pattern)
print()

files = os.listdir('.')
for name in sorted(files):
    print('Filename: {:<25} {}'.format(name, fnmatch.fnmatch(name, pattern)))
    
# output
# Pattern : fnmatch_*.py
# 
# Filename: fnmatch_filter.py         True
# Filename: fnmatch_fnmatch.py        True
# Filename: fnmatch_fnmatchcase.py    True
# Filename: fnmatch_translate.py      True
# Filename: index.rst                 False
複製程式碼

在此示例中,模式匹配所有以 'fnmatch_' 開頭和以 '.py' 結尾的檔案。

要強制進行區分大小寫的比較,無論檔案系統和作業系統設定如何,請使用 fnmatchcase()

import fnmatch
import os

pattern = 'FNMATCH_*.PY'
print('Pattern :', pattern)
print()

files = os.listdir('.')

for name in sorted(files):
    print('Filename: {:<25} {}'.format(name, fnmatch.fnmatchcase(name, pattern)))
    
# output
# Pattern : FNMATCH_*.PY
# 
# Filename: fnmatch_filter.py         False
# Filename: fnmatch_fnmatch.py        False
# Filename: fnmatch_fnmatchcase.py    False
# Filename: fnmatch_translate.py      False
# Filename: index.rst                 False
複製程式碼

由於用於測試此程式的 OS X 系統使用區分大小寫的檔案系統,因此沒有檔案與修改後的模式匹配。

過濾

要測試檔名序列,使用 filter(),它返回與 pattern 引數匹配的名稱列表。

import fnmatch
import os
import pprint

pattern = 'fnmatch_*.py'
print('Pattern :', pattern)

files = list(sorted(os.listdir('.')))

print('\nFiles   :')
pprint.pprint(files)

print('\nMatches :')
pprint.pprint(fnmatch.filter(files, pattern))

# output
# Pattern : fnmatch_*.py
# 
# Files   :
# ['fnmatch_filter.py',
#  'fnmatch_fnmatch.py',
#  'fnmatch_fnmatchcase.py',
#  'fnmatch_translate.py',
#  'index.rst']
# 
# Matches :
# ['fnmatch_filter.py',
#  'fnmatch_fnmatch.py',
#  'fnmatch_fnmatchcase.py',
#  'fnmatch_translate.py']
複製程式碼

在此示例中,filter() 返回與此部分關聯的示例原始檔的名稱列表。

翻譯模式

在內部,fnmatchglob 模式轉換為正規表示式,並使用 re 模組比較名稱和模式。translate() 函式是將 glob 模式轉換為正規表示式的公共 API。

import fnmatch

pattern = 'fnmatch_*.py'
print('Pattern :', pattern) # Pattern : fnmatch_*.py
print('Regex   :', fnmatch.translate(pattern))  # Regex   : (?s:fnmatch_.*\.py)\Z
複製程式碼

原文連結:

pymotw.com/3/fnmatch/i…

相關文章