/ / Come continuare il ciclo quando il file non viene trovato - python

Come continuare il ciclo quando il file non viene trovato - python

Sto cercando di stampare l'elenco di file nell'intervallo di date impostato dall'utente.

Questo è il mio file di esempio: si noti che non c'è "2015-01-01" nel file

inserisci la descrizione dell'immagine qui

Se inserisco intervallo da 2015-01-02 a 2015-01-05 stamperà la lista se i file. Ma se input da 2015-01-01 a 2015-01-05 provocherà un errore:

OSError: (2, "No such file or directory", "\2015-01-01")

È possibile provare-except-pass o continuare in modo che il mio ciclo continui e venga stampato 2015-01-02 a 2015-01-05. E basta negare il file non trovato.

Questo è il mio codice attuale:

FileNameList = []
date = start_date
while date <= end_date:
folder_name = date.strftime(DATE_FORMAT)
data_folder = path.join(pathDir, folder_name)
#print data_folder

for filefolder in os.listdir(data_folder):
filefolder = data_folder + "\" + filefolder

FileNameList.append(filefolder)

date += delta_one_day

for filefolder in FileNameList:
for file in os.listdir(filefolder):
if ".txt" in file:
filename = filefolder + "\" + file
print filename

risposte:

0 per risposta № 1

Potresti circondare il os.listdir chiama con una prova tranne:

try:
for filefolder in os.listdir(data_folder):
filefolder = data_folder + "\" + filefolder
except OSError:
pass

2 per risposta № 2

Potresti provare / ad eccezione del ciclo, ma una soluzione migliore potrebbe essere quella di aggiungere solo le directory esistenti al tuo elenco in primo luogo:

# your code and while loop here

if os.path.isdir(data_folder):
for filefolder in os.listdir(data_folder):
filefolder = data_folder + "\" + filefolder

if os.path.isdir(filefolder):
FileNameList.append(filefolder)

Mettendo a for loop all'interno di un try / except block può diventare un po 'disordinato, dal momento che non si può continuare il ciclo da dove si era interrotto nel caso in cui si verificasse un'eccezione. Strategia EAFP:

for filefolder in FileNameList:
try:
files = os.listdir(filefolder)
except OSError:
# You could log/print a warning here if you need.
continue
for file in files:
if ".txt" in file:
filename = filefolder + "\" + file
print filename

1 per risposta № 3

Hai dato la risposta da solo.

try:
#handles the file
except OSError:
pass # or log it if needed.

0 per risposta № 4

Puoi usare il continua dichiarazione :

L'istruzione continue in Python restituisce ilcontrollo all'inizio del ciclo while. L'istruzione continue rifiuta tutte le dichiarazioni rimanenti nell'iterazione corrente del ciclo e sposta il controllo in cima al ciclo.

L'istruzione continue può essere utilizzata sia in modalità while che in loop.

 #!/usr/bin/python

for letter in "Python":     # First Example
if letter == "h":
continue
print "Current Letter :", letter

var = 10                    # Second Example
while var > 0:
var = var -1
if var == 5:
continue
print "Current variable value :", var
print "Good bye!"

Questo produrrà il seguente risultato:

Current Letter : P
Current Letter : y
Current Letter : t
Current Letter : o
Current Letter : n
Current variable value : 10
Current variable value : 9
Current variable value : 8
Current variable value : 7
Current variable value : 6
Current variable value : 4
Current variable value : 3
Current variable value : 2
Current variable value : 1
Good bye!

0 per risposta № 5

Di seguito è riportato un esempio in cui controlliamo che illa directory esiste prima di progredire con il ciclo for. Può essere considerato più "pythonic" per usare una prova, eccetto il blocco, tuttavia credo che in questo caso un semplice controllo sia più pulito (solo la mia opinione).

for filefolder in FileNameList:
# CHECK THAT THE DIRECTORY EXISTS HERE
if not os.path.isdir(filefolder):
continue # this instruction will immediately jump to the next for loop iteration, effectively skipping the current iteration.
for file in os.listdir(filefolder):
if ".txt" in file:
filename = filefolder + "\" + file
print filename