Проблемы с печатью результатов поиска не найдены

В приведенном ниже коде программа получает строковые данные от пользователя и преобразовывает их в ascii и шестнадцатеричный формат, а также ищет во всех файлах .log и .txt в определенном каталоге строку в виде простой строки, шестнадцатеричного и ascii значений. Программа печатает строку # , тип найденной строки и путь к файлу, если строка найдена. Однако я не только хочу, чтобы он печатал файлы, если строка найдена, я также хотел бы, чтобы он печатал файл, путь и строку, которые были найдены в файлах, которые были найдены, но не найдены. Я новичок, поэтому, пожалуйста, не расстраивайтесь из-за простоты проблемы. Я все еще учусь. Спасибо. Код ниже:

 elif searchType =='2':
      print "\nDirectory to be searched: " + directory
      print "\nFile result2.log will be created in: c:\Temp_log_files."
      paths = "c:\\Temp_log_files\\result2.log"
      temp = file(paths, "w")
      userstring = raw_input("Enter a string name to search: ")
      userStrHEX = userstring.encode('hex')
      userStrASCII = ''.join(str(ord(char)) for char in userstring)
      regex = re.compile(r"(%s|%s|%s)" % ( re.escape( userstring ), re.escape( userStrHEX ), re.escape( userStrASCII )))
      goby = raw_input("Press Enter to begin search (search ignores whitespace)!\n")


      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)
              break
          elif not result:
              template = "\nLine: {0}\nString not found in File: {1}\nString Type: {2}\n\n"
              output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())

              print output
              temp.write(output)

      else:          
          print "There are no files in the directory!!!"

person suffa    schedule 21.06.2011    source источник
comment
Вы понимаете, что это заставит его печатать каждую строку каждого найденного файла, верно? Если это то, чего вы хотите, что не так? Глядя на код, кажется, все в порядке   -  person carlpett    schedule 22.06.2011
comment
Я согласен с карлпетом. В нем говорится, что вы хотите распечатать файл, но действительно ли вам нужно имя файла? Также некоторые примеры вывода помогут кучам.   -  person James Khoury    schedule 23.06.2011


Ответы (1)


Ребята, я думаю, что пользователь 706808 хочет найти все вхождения строки поиска в файле и:

  • для каждого вхождения, если строка найдена в файле, то для каждой СТРОКИ вывести номер строки, путь к файлу
  • если строка НЕ ​​найдена в файле, то для каждого ФАЙЛА выводить путь к файлу (но не содержимое) и строку поиска. Самый простой способ сделать это - сохранить логическое (или целое) отслеживание вхождений (nMatches), а затем напечатать сообщение о несоответствии в конце (если nMatches равно 0 или False), прежде чем вы закроете файл или имя пути выйдет из контекста .

Можешь подтвердить? Предполагая, что это то, что вы хотите, все, что вам нужно изменить, это разделить эту мегалинию кода...

for line in fileinput.input(walk_dir(directory, (".log", ".txt"))):

в...

for curPathname in walk_dir(directory, (".log", ".txt")):
    nOccurrences = 0
    for line in fileinput.input(curPathname):
        result = regex.search(whitespace.sub('', line))
        if result:
            ...
            nOccurrences += 1  # ignores multiple matches on same line 
        # You don't need an 'elif not result' line, since that should happen on a per-file basis
    # Only get here when we reach EOF
    if (nOccurrences == 0):
        NOW HERE print the "not found" message, for curPathname
    # else you could print "found %d occurrences of %s in ..."

Звучит неплохо?

Кстати, теперь вы можете просто ссылаться на fileinput.filename() как на 'curPathname'.

(Также вы можете абстрагировать функциональность в функцию find_occurrences(searchstring,pathname), которая возвращает int или Boolean 'nOccurrences'.)

person smci    schedule 24.06.2011
comment
это не было полностью моей целью, но это дало мне другие идеи и помогло мне пересмотреть мой код... Спасибо! - person suffa; 29.06.2011