yohhoyの日記

技術的メモをしていきたい日記

ワイルドカードの展開

Pythonでファイル名のワイルドカード展開を行う。

# expand_wc.py
import sys, glob, operator
print sys.argv[1:]  # 展開前
sys.argv = reduce(operator.add, map(glob.glob, sys.argv))
print sys.argv[1:]  # 展開後

実行結果:

$ ls
abc.txt     xyz.txt     expand_wc.py

$ python expand_wc.py *.txt *.py
['abc.txt', 'xyz.txt', 'expand_wc.py']
['abc.txt', 'xyz.txt', 'expand_wc.py']

$ python expand_wc.py '*.txt' '*.py'
['*.txt', '*.py']
['abc.txt', 'xyz.txt', 'expand_wc.py']

前者はシェルによるワイルドカード展開、後者はPythonによるワイルドカード展開が行われている。

別解:ナイーブな実装

import sys, glob
L = []
for ptn in sys.argv:
  for fn in glob.glob(ptn):
    L.append(fn)
sys.argv = L

別解:リストの内包表記

import sys, glob
sys.argv = [fn for fn in [glob.glob(ptn) for ptn in sys.argv]]
# または
sys.argv = [fn for ptn in sys.argv for fn in glob.glob(ptn)]

内包表記の入れ子(後者)は正直読めない。