2012-09-19 17 views
11

Voy a través de ejercicios de Python de Google y tengo que ser capaz de hacer esto desde la línea de comandos:Pasando multple archivos con asterisco para Python Shell en Windows

python babynames.py --summaryfile baby*.html 

Dónde python es la terminal de Python, babynames.py es el programa Python, --summaryfile es un argumento para ser interpretado por mi programa babynames, y baby*.html es la lista de archivos que coinciden con esa expresión. Sin embargo, no funciona y no estoy seguro de si el problema es el shell de comandos de Windows o Python. La expresión baby*.html no se está expandiendo a la lista completa de archivos, sino que se pasa estrictamente como una cadena. ¿Se pueden pasar múltiples archivos a un programa de Python de esa manera?

Respuesta

12

El intérprete de comandos de Windows no expande comodines como los shells de UNIX antes de pasarlos al script o programa ejecutado.

python.exe -c "import sys; print sys.argv[1:]" *.txt 

Resultado:

['*.txt'] 

Solución: Utilice el módulo glob.

from glob import glob 
from sys import argv 

for filename in glob(argv[1]): 
    print filename 
+0

¿Es necesario para comprobar los argumentos que contienen comodines y luego usar pegote en los ... o puedo? solo usa glob en todos los argumentos? – Mike

+0

Bien, parece que puedo llamar a glob sobre los argumentos del archivo si contienen comodines o no. Glob-rific :) – Mike

+0

Sí, un nombre de archivo sin ningún comodín es un patrón que coincide exactamente con un archivo (o ninguno). La diferencia es que obtienes una lista vacía de 'glob()' en ese caso, en lugar de descubrir más tarde que el archivo no existe. Esto es sutil, pero puede cambiar la forma en que desea manejar los errores. – kindall

4

multiplataforma:

import glob 
if '*' in sys.argv[-1]: 
    sys.argv[-1:] = glob.glob(sys.argv[-1]) 
continue... 
+0

también podría ser un '?' – jtlz2

0

Usando argparse:

import argparse 
parser=argparse.ArgumentParser() 
parser.add_argument(dest='wildcard',nargs='+') 

print(parser.parse_args().wildcard) 
Cuestiones relacionadas