2012-02-29 23 views
9

Mi rendo conto che questo sembra simile ad altre domande sul controllo dell'esistenza di un file, ma è diverso. Sto cercando di capire come verificare che un tipo di file esista e uscire se non lo fa. Il codice che ho provato in origine è questo:Verificare che esista un * tipo * di file in Python

filenames = os.listdir(os.curdir) 

for filename in filenames: 

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

Questo funziona a 'fare cose' per il file che termina in .fna, ma ho bisogno di controllare e assicurarsi che il file .fna c'è e uscire dal programma interamente se non.

ho provato questo:

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) 

Ma che non ha funzionato, salta solo l'intera funzione se il file .fna non c'è, senza stampare l'errore.

+0

e si ha un errore di battitura nella tua singolarmente-virgoletta –

+0

E una sequenza non-escape strano '/ n'. – Amadan

risposta

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

Il for statement in Python ha un poco noto else clausola:

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 clausola else è gestito solo se l'istruzione for attraversa tutta la sua enumerazione senza eseguire il break all'interno del ciclo.

7

Guardate il modulo 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

Com'è criptico, eh? –

0

Se si utilizza eccezioni, non test per vedere se il file esiste. Ecco perché stai usando le eccezioni per iniziare.

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 

Per chiarire, si consideri il frammento di codice:

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

tuo blocco try/except non ha funzionato perché os.path.isfile non un'eccezione se non riesce; restituisce semplicemente False.

else le clausole per i loop for sono strane e non intuitive. Usare break per indicare che il ciclo ha avuto successo anziché legittimamente romperlo è solo strano, e contrariamente alla filosofia di Python.

Ecco un bel modo, Pythonic di fare ciò che si vuole:

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

Partenza os.path.splitext funzione (percorso) che dice:

Spalato il percorso path in una coppia (root, ext) tale che root + ext == path, ed ext è vuoto o inizia con un punto e contiene al massimo un punto. I periodi principali sul basename sono ignorati; splitext ('. cshrc') restituisce ('.cshrc', '').

Ecco un esempio:

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