2015-07-08 3 views
0

Я работаю над проектом, который требует от меня поиска нескольких ключевых слов в файле. Например, если бы у меня был файл со 100 вхождениями слова «Томатный», 500 для слова «Хлеб» и 20 для «Pickle», я хотел бы иметь возможность искать файл для «Томатов» и «Хлеба» "и получить количество раз, которое оно встречается в файле. Я смог найти людей с тем же вопросом/вопросом, но для других языков на этом сайте.Множественный поиск слов не работает правильно (Python)

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

def start(): 
    location = raw_input("What is the folder containing the data you like processed located? ") 
    #location = "C:/Code/Samples/Dates/2015-06-07/Large-Scale Data Parsing/Data Files" 
    if os.path.exists(location) == True: #Tests to see if user entered a valid path 
     file_extension = raw_input("What is the file type (.txt for example)? ") 
     search_for(location,file_extension) 
    else: 
     print "I'm sorry, but the file location you have entered does not exist. Please try again." 
     start() 

def search_for(location,file_extension): 
    querylist = [] 
    n = 5 
    while n == 5: 
     search_query = raw_input("What would you like to search for in each file? Use'Done' to indicate that you have finished your request. ") 
     #list = ["CD90-N5722-15C", "CD90-NB810-4C", "CP90-N2475-8", "CD90-VN530-22B"] 
     if search_query == "Done": 
      print "Your queries are:",querylist 
      print "" 
      content = os.listdir(location) 
      run(content,file_extension,location,querylist) 
      n = 0 
     else: 
      querylist.append(search_query) 
      continue 


def run(content,file_extension,location,querylist): 
    for item in content: 
     if item.endswith(file_extension): 
      search(location,item,querylist) 
    quit() 

def search(location,item,querylist): 
    with open(os.path.join(location,item), 'r') as f: 
     countlist = [] 
     for search in querylist: #any search value after the first one is incorrectly reporting "0" 
      countsearch = 0 
      for line in f: 
       if search in line: 
        countsearch = countsearch + 1 
      countlist.append(search) 
      countlist.append(countsearch) #mechanism to update countsearch is not working for any value after the first 
     print item, countlist 

start() 

Если я использую этот код, последняя часть (def search) работает некорректно. Каждый раз, когда я помещаю поиск в любой поиск после первого ввода, я возвращаю «0», несмотря на то, что в файле содержится до 500 000 вхождений слова поиска.

Мне также было интересно, так как мне нужно индексировать 5 файлов по 1 000 000 строк каждый, если бы я мог написать либо дополнительную функцию, либо что-то, чтобы подсчитать, сколько раз «Салат» происходит по всем файлам.

Я не могу размещать файлы здесь из-за их размера и содержания. Любая помощь будет принята с благодарностью.

Редактировать

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

def check_start(): 
    #location = raw_input("What is the folder containing the data you like processed located? ") 
    location = "C:/Code/Samples/Dates/2015-06-07/Large-Scale Data Parsing/Data Files" 
    content = os.listdir(location) 
    for item in content: 
     if item.endswith("processed"): 
      countcol1 = 0 
      countcol2 = 0 
      countcol3 = 0 
      countcol4 = 0 
      #print os.path.join(currentdir,item) 
      with open(os.path.join(location,item), 'r') as f: 
        for line in f: 
         if "CD90-N5722-15C" in line: 
          countcol1 = countcol1 + 1 
         if "CD90-NB810-4C" in line: 
          countcol2 = countcol2 + 1 
         if "CP90-N2475-8" in line: 
          countcol3 = countcol3 + 1 
         if "CD90-VN530-22B" in line: 
          countcol4 = countcol4 + 1 
      print item, "CD90-N5722-15C", countcol1, "CD90-NB810-4C", countcol2, "CP90-N2475-8", countcol3, "CD90-VN530-22B", countcol4 
+0

Можете ли вы исправить ваш код вдавливания, пожалуйста. – SiHa

+0

@SiHa Спасибо, что сообщили мне, но я не вижу, где он выключен. Не могли бы вы сообщить мне, пожалуйста? – TobyTobyo

+0

Похоже, вам нужно отступать от линий после определения функций. – alfonso

ответ

0

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

Если добавить строку:

f.seek(0), это приведет к сбросу указатель перед каждым чтения:

def search(location,item,querylist): 
    with open(os.path.join(location,item), 'r') as f: 
     countlist = [] 
     for search in querylist: #any search value after the first one is incorrectly reporting "0" 
      countsearch = 0 
      for line in f: 
       if search in line: 
        countsearch = countsearch + 1 
      countlist.append(search) 
      countlist.append(countsearch) #mechanism to update countsearch is not working for any value after the first 
      f.seek(0) 
    print item, countlist 

PS. Я догадался об отступлении ... действительно не должен использовать вкладки.

+0

Извините! Я действительно должен использовать пробелы, но Pycharm не может сказать разницу (он заменяет 4 пробела для вкладки в программе). Метод f.seek (0) не работал для меня, я все еще возвращаю 0 для любого значения после первого: 'out-30000000.txt.processed ['CD90-N5722-15C', 438956, 'CD90- NB810-4C ', 0] ' – TobyTobyo

+0

@TobyTobyo, поиск был неправильным местом, все, что он делал, это поиск начала файла, когда он был уже на старте, вам нужно искать после каждой итерации по f –

+1

Спасибо @PadraicCunningham Это работает! – TobyTobyo

0

Я не уверен, что полностью понял ваш вопрос, но как насчет чего-то подобного?

def check_start(): 

    raw_search_terms = raw_input('Enter search terms seperated by a comma:') 
    search_term_list = raw_search_terms.split(',') 

    #location = raw_input("What is the folder containing the data you like processed located? ") 
    location = "C:/Code/Samples/Dates/2015-06-07/Large-Scale Data Parsing/Data Files" 
    content = os.listdir(location) 

    for item in content: 
     if item.endswith("processed"): 
      # create a dictionary of search terms with their counts (initialized to 0) 
      search_term_count_dict = dict(zip(search_term_list, [0 for s in search_term_list])) 

      for line in f: 
       for s in search_term_list: 
        if s in line: 
         search_term_count_dict[s] += 1 



     print item 
     for key, value in search_term_count_dict.iteritems() : 
      print key, value 
+0

Спасибо за ответ, но это было не совсем то, что я искал для. Метод Сиха и Каннингема - это то, что я искал. Большое спасибо за ответ, хотя! – TobyTobyo

+0

Нет проблем. Рад, что вы нашли что-то, что работает. – alfonso

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