2012-02-29 22 views
9

Me doy cuenta de que esto se parece a otras preguntas sobre cómo verificar si existe un archivo, pero es diferente. Estoy tratando de averiguar cómo comprobar que existe un tipo de archivo y salir si no lo hace. El código que he intentado originalmente es la siguiente:Compruebe que existe un * tipo * de archivo en Python

filenames = os.listdir(os.curdir) 

for filename in filenames: 

    if os.path.isfile(filename) and filename.endswith('.fna'): 
     ##do stuff 

Esto funciona a 'hacer cosas' en el fichero que termina en .fna, pero lo necesito para comprobar y asegurarse de que el archivo .fna está ahí y salir del programa completamente si no.

yo probamos este:

try: 

    if os.path.isfile(filename) and filename.endswith('.fna'): 
     ## Do stuff 
except: 

    sys.stderr.write (‘No database file found. Exiting program. /n’) 
    sys.exit(-1) 

Pero eso no funcionó, simplemente se salta toda la función si el archivo .fna no está ahí, sin imprimir el error.

+0

y tiene un error tipográfico en su forma individual-comilla –

+0

y una secuencia de escape no extraña '/ n '. – Amadan

Respuesta

1
filenames = os.listdir(os.curdir) 
found = False 
for filename in filenames: 
    if os.path.isfile(filename) and filename.endswith('.fna'): 
     found = True 
if not found: 
    sys.stderr.write ('No database file found. Exiting program. \n') 
    sys.exit(-1) 
9

El for statement in Python tiene una poco conocida cláusula else:

for filename in filenames: 
    if os.path.isfile(filename) and filename.endswith(".fna"): 
     # do stuff 
     break 
else: 
    sys.stderr.write ('No database file found. Exiting program. \n') 
    sys.exit(-1) 

La cláusula else se ejecuta solamente si la declaración for corre a través de toda su enumeración sin ejecutar la break dentro del bucle.

7

Mira el módulo de glob:

import glob 
import os 
import sys 

databases = filter(os.path.isfile, glob.glob('./*.fna')) 

if not databases: 
    sys.stderr.write("No database found.\n\n") 
    exit(1) 

for database in databases: 
    do_something_with(database) 
+0

¿Qué tan pitónico es eso, eh? –

0

Si está utilizando excepciones, no hacen pruebas para ver si existe el archivo. Es por eso que estás usando excepciones para empezar.

try: 
    # No if statement doing the check 
    # Start doing stuff assuming abc.fna exists 
except: 
    # Uh oh! Something went bad. 
    # Display error messages, clean up, carry on 

Para aclarar, consideran que el fragmento de código:

try: 
    with open('hi.txt') as f: 
     print f.readlines() 
except: 
    print 'There is no hi.txt!' 
0

su bloque try/except no funcionó debido a os.path.isfile no lanzar una excepción si falla; simplemente devuelve False.

else Las frases para for son extrañas y no intuitivas. Usar break para indicar que el ciclo fue exitoso en lugar de romperlo legítimamente es simplemente extraño, y contrario a la filosofía de Python.

Aquí está una manera agradable, Pythonic de hacer lo que quiere:

want = lambda f: os.path.isfile(f) and f.endswith(".fna") 
valid_files = [f for f in os.listdir(os.curdir) if want(f)] 
if len(valid_files) == 0: 
    print >>sys.stderr, "failed to find .fna files!" 
    sys.exit(1) 
for filename in valid_files: 
    # do stuff 
0

Salida os.path.splitext función (ruta), que dice:

dividir el trazado nombre de ruta en un par (raíz, ext) tal que root + ext == ruta, y ext está vacía o comienza con un punto y contiene como máximo un punto. Los períodos iniciales en el nombre base se ignoran; splitext ('. cshrc') devuelve ('.cshrc', '').

He aquí un ejemplo:

>>> os.path.splitext("./01The News from Lake Wobegon/AlbumArtSmall.jpg") 
('./01The News from Lake Wobegon/AlbumArtSmall', '.jpg') 
>>> 
Cuestiones relacionadas