Проблемы с поиском не найдены - PullRequest
2 голосов
/ 21 июня 2011

В приведенном ниже коде программа получает строковые данные от пользователя и преобразует их в ascii и hex и ищет во всех файлах .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!!!"

1 Ответ

1 голос
/ 24 июня 2011

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

  • для каждого вхождения, если в файле найдена строка, а затем на основе LINE, печатать белье,путь к файлу
  • если строка НЕ ​​найдена в файле, то для каждого ФАЙЛА выведите путь к файлу (но не его содержимое) и строку поиска.Самый простой способ сделать это - сохранить логическое (или int) отслеживание вхождений (nMatches), а затем распечатать сообщение no-match-end в конце (если 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_occurferences (searchstring, pathname), которая возвращает int илиBoolean 'nOccurrence'.)

...