2015-08-26 2 views
2

Я пытаюсь распечатать список файлов в диапазоне дат, заданных пользователем.Как продолжить цикл, когда файл не найден

Это мои файлы примеров: Обратите внимание, что нет «2015-01-01» в файле

enter image description here

Если я входной диапазон от 2015-01-02 до 2015-01-05 будет выводить список, если файлы. Но если я вход от 2015-01-01 к 2015-01-05 это приведет к ошибке:

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

Можно ли иметь примерочные кроме обводного или продолжать так, что мой цикл будет продолжаться еще и печатает 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

Предполагается, что оператор 'FileNameList.append' должен находиться в первом цикле for? Переменная 'filefolder', используемая вашим циклом' for', перезаписывается на каждой итерации цикла 'for', а затем переменная' filefolder' добавляется к 'FilenameList' только после завершения цикла' for'. – samstav

ответ

0

Вы могли бы окружить os.listdir вызов с попыткой за исключением:

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

Это не закончит цикл 'for', если возникнет OSError. – samstav

1

Вы дали ответ сами.

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

'' pass'' следует заменить '' continue'' – steve

+0

, если я использую «pass», нет результата вывода, но если я буду использовать «continue», приложение застрянет и зависает. –

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/за исключением блока может получить немного грязный, так как вы не сможете продолжить цикл, где вы оставили о ff в случае возникновения исключения. Но если вы хотите придерживаться EAFP strategy:

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 
0

Вы можете использовать продолжить заявление:

Оператор по-прежнему в Python возвращает управление в начало цикла. Оператор 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

Ниже приведен пример, где мы проверяем, что каталог существует до перехода с для цикла. Можно использовать более «pythonic» для использования try, кроме блока, однако я считаю, что в этом случае простая проверка чище (только мое мнение).

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  
+0

Проверка должна быть 'os.path.isdir' вместо' os.path.exists', так как 'os.listdir' будет бросать' OSError: [Errno 20] Не каталог: 'если ему передан путь к файл. – samstav

Смежные вопросы