2010-07-27 27 views
37

Joker karakterli bir arama modeline sahip bir dosya isimleri listesi istiyorum. Gibi:Joker kullanarak dosya arama

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

Bunu nasıl yapabilirim? Bunun gibi

cevap

59

:

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

Bu buradan doğruca gelir: http://docs.python.org/library/glob.html

+2

, bu kullanılan kabuk bağlı pek doğru değil. –

3
from glob import glob 
import sys 

files = glob(sys.argv[1]) 
17

glob sen ancak piton içinde bu yaptığını eğer faydalıdır, Kabuk geçen olmayabilir * (Windows kabuğuna aşina değilim). Ben aşağıdakileri yapın Örneğin

: Benim kabuk üzerinde

import sys 
print sys.argv 

, ben yazın: argv değil

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

Bildirim o:

$ python test.py *.jpg 

Ben bu olsun "*.jpg"

numaralı telefonu içerir.

Buradaki önemli ders, çoğu merminin, uygulamanıza geçirilmeden önce kabuk'daki yıldız işaretini genişletmesidir.

Bu durumda, dosya listesini almak için sadece sys.argv[1:] yapardım. Alternatif olarak, *'dan kurtulabilirsiniz, böylece python * harfini görür. Ardından, glob modülünü kullanabilirsiniz. Ben size komut birden kabuk üzerinde ve * kullanarak birden parametreleri kullanmak istediğinizde bu çok yararlı buldum çünkü

$ getFileNames.py "*.jpg" 

veya

$ getFileNames.py \*.jpg 
0

önceki bu ekliyorum.

her kabukları üzerinde çalışan bir şey istiyorsanız, (hala glob kullanarak) aşağıdakileri yapabilirsiniz: Bir test dosya varsa ve t* vermek ve eğer (yinelenen üretebilir

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

Not te*), ancak sadece bir set kullanarak kaldırabilirsiniz:

Donald Miner diğer yanıtında işaret ettiği gibi
>>> set(reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], [])) 
İlgili konular