2010-11-28 16 views
22

Me gustaría comprobar si hay algún archivo .rar en un directorio. no necesita ser recursivoUsar comodín con os.path.isfile()

Usar comodín con os.path.isfile() fue mi mejor suposición, pero no funciona. ¿Qué puedo hacer entonces?

Gracias.

+3

debe aceptar una respuesta a esta pregunta ... – GreenAsJade

Respuesta

2

comodines se expanden por Shell y por lo tanto no se puede utilizar con os.path.isfile()

Si desea utilizar comodines, se puede usar popen with shell = True o os.system()

>>> import os 
>>> os.system('ls') 
aliases.sh   
default_bashprofile  networkhelpers   projecthelper.old   pythonhelpers   virtualenvwrapper_bashrc 
0 
>>> os.system('ls *.old') 
projecthelper.old 
0 

También podría obtener el mismo efecto con el módulo glob.

>>> import glob 
>>> glob.glob('*.old') 
['projecthelper.old'] 
>>> 
49

glob es lo que necesita.

>>> import glob 
>>> glob.glob('*.rar') # all rar files within the directory, in this case the current working one 

os.path.isfile() vuelve True si un camino es un archivo normal existente. Entonces eso se usa para verificar si un archivo ya existe y no admite comodines. glob hace.

+0

1 sólo me ganó de mano mientras yo estaba tratando de sacar una respuesta completa. – pyfunc

+1

Desafortunadamente, sin usar os.path.isfile() para verificar los resultados, aún no se sabe si lo que ha encontrado son directorios o archivos. –

2
import os 
[x for x in os.listdir("your_directory") if len(x) >= 4 and x[-4:] == ".rar"] 
4

Sin utilizar os.path.isfile() que no se sabe si los resultados devueltos por glob() son archivos o subdirectorios, por lo que intentar algo como esto en su lugar:

import fnmatch 
import os 

def find_files(base, pattern): 
    '''Return list of files matching pattern in base folder.''' 
    return [n for n in fnmatch.filter(os.listdir(base), pattern) if 
     os.path.isfile(os.path.join(base, n))] 

rar_files = find_files('somedir', '*.rar') 

También puedes, simplemente filtrar los resultados devueltos por glob() si lo desea, y tiene la ventaja de hacer algunas cosas adicionales relacionadas con Unicode y similares. Compruebe la fuente en glob.py si es importante.

[n for n in glob(pattern) if os.path.isfile(n)] 
+0

Cuando dices "esto tiene la ventaja", ¿te refieres a que 'glob' tiene la ventaja o que' fnmatch' tiene la ventaja? –

+1

@RichardCorden, lo reformulé para aclarar que el glob tiene la ventaja allí. –

0

iglob es mejor que el pegote aquí, ya que en realidad no quiere que la lista completa de los archivos rar, pero sólo quieren comprobar que existe una rar

+3

Si bien esto es realmente cierto, esta respuesta se beneficiaría de una explicación más detallada. La diferencia es que 'iglob' devuelve un iterador, por lo que si lo llamas una vez y devuelve algo, sabes que hubo al menos una coincidencia. – tripleee

0

Si sólo se preocupa por si existe al menos un archivo y no desea una lista de los archivos:

import glob 
import os 

def check_for_files(filepath): 
    for filepath_object in glob.glob(filepath): 
     if os.path.isfile(filepath_object): 
      return True 

    return False