2014-04-10 24 views
6

Mam Pythona 2.7 i staram się wydawać:ekspansja Brace w Pythona glob

glob('{faint,bright*}/{science,calib}/chip?/') 

mogę uzyskać żadnych wyników, jednak z powłoki echo {faint,bright*}/{science,calib}/chip? daje:

faint/science/chip1 faint/science/chip2 faint/calib/chip1 faint/calib/chip2 bright1/science/chip1 bright1/science/chip2 bright1w/science/chip1 bright1w/science/chip2 bright2/science/chip1 bright2/science/chip2 bright2w/science/chip1 bright2w/science/chip2 bright1/calib/chip1 bright1/calib/chip2 bright1w/calib/chip1 bright1w/calib/chip2 bright2/calib/chip1 bright2/calib/chip2 bright2w/calib/chip1 bright2w/calib/chip2 

Co jest nie tak z moim wypowiedzi ?

+0

I don” t Myślę, że moduł glob obsługuje nawiasy klamrowe, zobacz http://bugs.python.org/issue9584 –

+0

Moduł ['fnmatch' (https://docs.python.org/2/library/fnmatch.html) (używany przez' glob' do implementacji dopasowywania nazw plików) nie jest tak zaawansowany, aby obsługiwać '{. ..} 'składnia rozszerzenia brace. –

Odpowiedz

3

Od {} nie są częścią glob() w Pythonie, co prawdopodobnie chcesz coś jak

import os 
import re 

... 

match_dir = re.compile('(faint|bright.*)/(science|calib)(/chip)?') 
for dirpath, dirnames, filenames = in os.walk("/your/top/dir") 
    if match_dir.search(dirpath): 
     do_whatever_with_files(dirpath, files) 
     # OR 
     do_whatever_with_subdirs(dirpath, dirnames) 
3

{..} jest znana jako rozszerzenie nawiasów klamrowych i jest oddzielnym krokiem zastosowanym przed rozpoczęciem globalizacji.

Nie jest częścią globów i nie jest obsługiwana przez funkcję python glob.

2

Spróbuj https://pypi.python.org/pypi/braceexpand

pip install braceexpand 

Demo:

>>> from braceexpand import braceexpand 

# Integer range 
>>> list(braceexpand('item{1..3}')) 
['item1', 'item2', 'item3'] 

# Nested patterns 
>>> list(braceexpand('python{2.{5..7},3.{2,3}}')) 
['python2.5', 'python2.6', 'python2.7', 'python3.2', 'python3.3']