web-dev-qa-db-ja.com

ワイルドカードを使用してファイルを検索する

ワイルドカードを使用した検索パターンでファイル名のリストを取得したい。のような:

getFilenames.py c:\PathToFolder\*
getFilenames.py c:\PathToFolder\FileType*.txt
getFilenames.py c:\PathToFolder\FileTypeA.txt

これどうやってするの?

41
Stan

このような:

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

これはここから直接来ます: http://docs.python.org/library/glob.html

70
Martin

globは、Python内でこれを行う場合に役立ちますが、シェルが*を渡していない可能性があります(Windowsシェルに精通していません)。

たとえば、次のことを行う場合:

import sys
print sys.argv

シェルで、次のように入力します。

$ python test.py *.jpg

私はこれを得る:

['test.py', 'test.jpg', 'wasp.jpg']

argvには"*.jpg"が含まれていないことに注意してください

ここで重要な教訓は、ほとんどのシェルは、アプリケーションに渡される前に、シェルでアスタリスクを展開することです。

この場合、ファイルのリストを取得するには、sys.argv[1:]を実行します。または、*をエスケープして、pythonがリテラル*を参照できるようにします。その後、globモジュールを使用できます。

$ getFileNames.py "*.jpg"

または

$ getFileNames.py \*.jpg
19
Donald Miner
from glob import glob
import sys

files = glob(sys.argv[1])
5
Daniel Egeberg

スクリプトを複数のシェルで、*

すべてのシェルで機能するものが必要な場合は、次のことを実行できます(globを使用します)。

>>> import glob
>>> from functools import reduce # if using python 3+
>>> reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], [])

重複する可能性があることに注意してください(testファイルがあり、t*およびte*)、ただしsetを使用して単純に削除できます。

>>> set(reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], []))
0
Holt