ワイルドカードを使用した検索パターンでファイル名のリストを取得したい。のような:
getFilenames.py c:\PathToFolder\*
getFilenames.py c:\PathToFolder\FileType*.txt
getFilenames.py c:\PathToFolder\FileTypeA.txt
これどうやってするの?
このような:
>>> 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
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
from glob import glob
import sys
files = glob(sys.argv[1])
スクリプトを複数のシェルで、*
。
すべてのシェルで機能するものが必要な場合は、次のことを実行できます(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:], []))