2010-07-27 36 views

Trả lời

59

Như thế này:

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

này xuất phát thẳng từ đây: http://docs.python.org/library/glob.html

+2

Như Donald Miner chỉ ra trong câu trả lời khác, điều này là không hoàn toàn đúng phụ thuộc vào vỏ được sử dụng. –

3
from glob import glob 
import sys 

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

glob rất hữu ích nếu bạn đang làm điều này trong vòng trăn, tuy nhiên, shell của bạn có thể không được đi qua trong * (Tôi không quen với vỏ cửa sổ).

Ví dụ, khi tôi làm như sau:

import sys 
print sys.argv 

Mở vỏ của tôi, tôi gõ:

$ python test.py *.jpg 

tôi có được điều này:

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

ý rằng argv không chứa "*.jpg"

Bài học quan trọng ở đây là hầu hết các vỏ sẽ mở rộng dấu sao ở vỏ, trước khi nó được chuyển đến ứng dụng của bạn.

Trong trường hợp này, để lấy danh sách tệp, tôi chỉ cần thực hiện sys.argv[1:]. Ngoài ra, bạn có thể thoát khỏi *, để con trăn thấy chữ số *. Sau đó, bạn có thể sử dụng mô-đun glob.

$ getFileNames.py "*.jpg" 

hoặc

$ getFileNames.py \*.jpg 
0

tôi thêm này đến trước bởi vì tôi thấy điều này rất hữu ích khi bạn muốn kịch bản của bạn để làm việc trên nhiều vỏ và với nhiều thông số sử dụng *.

Nếu bạn muốn một cái gì đó mà làm việc trên tất cả các vỏ, bạn có thể làm như sau (vẫn còn sử dụng glob):

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

Lưu ý rằng nó có thể sản xuất lặp lại (nếu bạn có một tập tin test và bạn cung cấp cho t*te*), nhưng bạn chỉ có thể loại bỏ chúng bằng cách sử dụng set:

>>> set(reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], [])) 
Các vấn đề liên quan