/ / Як продовжити цикл, коли файл не знайдено - python

Як продовжувати цикл, коли файл не знайдений - python

Я намагаюся надрукувати список файлів у діапазоні дат, встановлених користувачем.

Це мої зразки файлів: Зверніть увагу, що у файлі немає "2015-01-01"

введіть опис зображення тут

Якщо я ввожу діапазон від 2015-01-02 до 2015-01-05 він надрукує список файлів. Але якщо я вводжу від 2015-01-01 до 2015-01-05 це призведе до помилки:

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

Чи можна мати try-Osim-Pass або continue, щоб мій цикл все ще продовжував і друкував 2015-01-02 до 2015-01-05. І просто відмовити файлу не знайдено.

Це мій поточний код:

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

Відповіді:

0 для відповіді № 1

Ви можете оточити os.listdir дзвоніть зі спробою, за винятком:

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

2 для відповіді № 2

Ви можете спробувати / за винятком циклу, але кращим рішенням може бути лише додавання існуючих каталогів до вашого списку спочатку:

# 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)

Введення for цикл всередині блоку try / osim може стати трохи брудним, оскільки ви не зможете продовжувати цикл там, де ви зупинилися, у випадку виникнення винятку. Але якщо ви хочете дотримуватися Стратегія 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 для відповіді № 3

Відповідь ви дали самі.

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

0 для відповіді № 4

Ви можете скористатись продовжити заяву :

Оператор continue у Python повертаєконтроль до початку циклу while. Оператор continue відхиляє всі інші оператори поточної ітерації циклу і переміщує елемент керування назад у верхню частину циклу.

Оператор continue може використовуватися як у циклі, так і для циклів.

 #!/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!"

Це дасть такий результат:

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 для відповіді № 5

Нижче наведено приклад, де ми перевіряємо, що файлкаталог існує до переходу до циклу for. Можна вважати більш "пітонічним" використовувати спробу, крім блоку, однак я вважаю, що в цьому випадку проста перевірка є чистішою (лише моя думка).

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