Поиск распечатывает результаты и условие "строка не найдена" - PullRequest
0 голосов
/ 17 июня 2011

Может кто-нибудь объяснить мне, почему мой оператор условного поиска возвращает оба результата (он находит строку, выводит результаты на экран и печатает «Строка не найдена»). Я внес изменения, но я должен что-то упустить из виду.

Код:

 if choice == '1':
         regex2  = re.compile(r'\s+')
         for root,dirname, files in os.walk(directory):
             for file2 in files:
                 if file2.endswith(".log") or file2.endswith(".txt"):
                    f=open(os.path.join(root, file2))
                    for i,line in enumerate(f.readlines()):
                        result2 = regex.search(re.sub(regex2, '',line))
                        if result2:
                           ln = str(i)
                           print "\nLine: " + ln
                           print "File: " + os.path.join(root,file2)
                           print "String Type: " + result2.group() + '\n'
                           temp.write('\nLine:' + ln + '\nString:' + result2.group() + '\nFile: ' + os.path.join(root,file2) + '\n')

                    else:
                       print "String not found!!!"
                    break  
                    f.close()    
         re.purge()

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

У вас проблема с отступом, я думаю, что вы хотите:

...
for i,line in enumerate(f.readlines()):
    result2 = regex.search(re.sub(regex2, '',line))
    if result2:
        ln = str(i)
        print "\nLine: " + ln
        print "File: " + os.path.join(root,file2)
        print "String Type: " + result2.group() + '\n'
        temp.write('\nLine:' + ln + '\nString:' + result2.group() + '\nFile: ' + os.path.join(root,file2) + '\n')

    else:  # <<<<<<<<<<<<<<<<<<<< HERE !!!!
        print "String not found!!!"
break
...
1 голос
/ 17 июня 2011

Предложение else для цикла for выполняется, если цикл выходит из-за того, что итерация, по которой он повторяется, исчерпана, а не из-за оператора break. Поскольку в вашем цикле нет break, предложение else всегда будет выполняться.

Вот попытка рефакторинга вашего кода. Он использует функцию генератора для генерации списка имен файлов и модуль fileinput для открытия и закрытия файлов. Ваша треска никогда явно не закрывает какой-либо файл из-за break непосредственно перед f.close().

def walk_dir(directory, extensions=""):
    for path, dirs, files in os.walk(directory):
        for name in files:
            if name.endswith(extensions):
                yield os.path.join(path, name)

whitespace  = re.compile(r'\s+')
for line in fileinput.input(walk_dir(directory, (".log", ".txt"))):
    result = regex.search(whitespace.sub('', line))
    if result:
        template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
        output = template.format(fileinput.filelineno(),
                                 fileinput.filename(),
                                 result.group())
        print output
        temp.write(output)
1 голос
/ 17 июня 2011

Пожалуйста, немного реорганизуйте свой код - слишком много отступов и смешанных управляющих структур.Так будет легче определить и исправить проблему.

Например - разбить цикл на обход и проверку:

def look_through(directory):
    found = 0
    for root, dirname, files in os.walk(directory):
        for filename in files:
            result = process_file(root, filename)
            if result is not None:
                found += 1
                yield result
    if found == 0:
        print 'blah, not found'

def process_file(...

Видите ли вы проблему с предыдущим кодом сейчас?Любое условие проверялось только для каждого файла, а затем - для каждого каталога.Не было глобального счетчика результатов или состояния поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...