2011-12-16 17 views
12

Sono davvero inciampato su questo.python's glob restituisce solo il primo risultato

Ho un semplice involucro di pitone che sembra qualcosa di simile:

import glob 

for found in glob.glob(filename): 
    if not os.path.isdir(found): 
    my_module.do_stuff(found) 

dove filename sono stati letti da sys.argv.

Quando provo glob in una shell interattiva o uno script Hello World, ottengo l'elenco completo dei file (in questo caso 5). Tuttavia, quando lo uso in questo contesto, ottengo solo il primo (in ordine alfabetico).

Ho controllato catturando il risultato di glob.glob in un array e abbastanza sicuro, è ottenuto solo un len() di 1, anche se il nome del file è solo '*'.

Cosa potrei fare in caso di interruzione glob?!

file di codice completa, nel caso in cui è possibile individuare la mia Gotcha:

#! /usr/bin/python 
import pynet.quadrons as q 
import os, glob 

def print_usage(): 
    print """ 
    (blah blah big long string.) 

    """ 

if __name__ == "__main__": 
    import sys 
    if len(sys.argv) < 2: 
    print_usage() 
    exit() 

    filename = '' 

    try: 
    filename = sys.argv[1] 
    except: 
    print "error parsing arguments." 
    print_usage() 
    exit() 

    for found in glob.glob(filename): 
    if not os.path.isdir(found): 
     q.load_and_analyse_file(found) 
+2

di poter postare un campione 'sys.argv'? – Blender

+0

Per favore pubblica un esempio: mostra il contenuto della cartella e il pattern che usi non funziona – gecco

risposta

14

Il guscio è in espansione il glob prima del tuo script Python vede. Pertanto il tuo script Python vede il primo nome file completo che corrisponde al glob in sys.argv[1], passa a quello glob() e ovviamente corrisponde solo a un file.

O quotare l'argomento nella shell con virgolette singole in modo che la shell non lo espanda, o semplicemente consentire alla shell di eseguire l'espansione e l'iterazione su tutti gli elementi di sys.argv (tranne il primo).

Vale la pena di notare che su Windows, la shell non si non globbing, quindi se lo script ha bisogno di lavorare cross-platform, si deve iterare sys.argv[1:] e glob ogni elemento.

+0

Grazie, esattamente cosa sta succedendo :) – tehwalrus

1

Debug 101: print len(sys.argv[1:]), repr(sys.argv[1:])

Catering per uno o più nomi di file e/o uno o più modelli:

for pattern in sys.argv[1:]: 
    for filename in glob.glob(pattern): 
     do_something_with(filename) 
Problemi correlati