2015-05-05 3 views
-1

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

а) петли через каждый год,
б) в каждом каждый год, цикл через каждый месяц (12 общих),
с) в течение каждого месяца, проходной каждый день (используя собственный счетчик дней),
d) и прочитайте 2 файла и объедините их вместе в другой файл.

В каждом случае я спускаюсь в каталог только в том случае, если существует. В противном случае я должен просто пропустить его и перейти к следующему. Мой код выполняет довольно хорошую работу , когда присутствуют все файлы, но когда один из файлов отсутствует, я просто хочу пропустить весь процесс создания объединенного файла и продолжить цикл. Проблема, которую я получаю, - это синтаксическая ошибка, указывающая, что continue не входит в цикл. Я получаю эту ошибку только в определениях функций, а не за их пределами.

Может кто-нибудь объяснить, почему я получаю эту ошибку?

import os, calendar 

file01 = 'myfile1.txt' 
file02 = 'myfile2.txt' 
output = 'mybigfile.txt' 

def main(): 
    #ROOT DIRECTORY 
    top_path = r'C:\directory'  
    processTop(top_path) 

def processTop(path): 
    year_list = ['2013', '2014', '2015'] 

    for year in year_list: 
     year_path = os.path.join(path, year) 
     if not os.path.isdir(year_path): 
      continue 
     else: 
      for month in range(1, 13): 
       month_path = os.path.join(year_path, month) 
       if not os.path.isdir(month_path): 
        continue 
       else: 
        numDaysInMth = calendar.monthrange(int(year), month)[1] 
        for day in range(1, numDaysInMth+1): 
         processDay(day, month_path) 
    print('Done!') 


def processDay(day, path): 
    day_path = os.path.join(path, day) 
    if not os.path.isdir(day_path): 
     continue 
    else: 
     createDailyFile(day_path, output) 


def createDailyFile(path, dailyFile): 
    data01 = openFile(file01, path) 
    data02 = openFile(file02, path) 

    if len(data01) == 0 or len(data02) == 0: 
     # either file is missing 
     continue 
    else: 
     # merge the two datalists into a single list 
     # create a file with the merged list 
     pass 

def openFile(filename, path): 
    # return a list of contents of filename 
    # returns an empty list if file is missing 
    pass 

if __name__ == "__main__": main() 
+0

Обратите внимание, что с помощью 'if ... then continue else ...' избыточно - вы можете пропустить ключевое слово 'else' и поместить остальную часть кода на том же уровне, поэтому вы использовали' continue' в первую очередь. –

ответ

1

Вы можете использовать continue только в цикле (в противном случае, что гарантирует, что функция была вызвана в цикле в первую очередь?) Если вам требуется разматывать стеки, подумайте об использовании исключений (Python exception handling).

Я думаю, что вы можете уйти с наличием ваши функции возвращают значение, которое будет сказать, если операция была успешно завершена:

def processDay(day, path): 
    do_some_job() 
    if should_continue: 
    return False 
    return True 

А потом в основной код просто сказать

if not processDay(day, path): 
    continue 
1

Вы, вероятно, получить эту ошибку в processDay и createDailyFile, верно? Это потому, что в этих функциях нет цикла, и все же вы используете continue. Я бы рекомендовал использовать в них return или pass.

1

Оператор continue применяется только в цикле, поскольку сообщение об ошибке подразумевает, что ваши функции структурированы, как вы показываете, вы можете просто использовать pass.

1

continue может появляться только в цикле, поскольку он указывает python не выполнять строки ниже и перейти к следующей итерации. Следовательно, этот синтаксис здесь недействителен:

def processDay(day, path): 
    day_path = os.path.join(path, day) 
    if not os.path.isdir(day_path): 
     continue # <============ this continue is not inside a loop ! 
    else: 
     createDailyFile(day_path, output)enter code here 

То же самое для вашей функции createDailyFile.

Возможно, вы захотите заменить его возвратом?

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