2014-11-23 6 views
1

Я пытаюсь сделать простую программу счетчика слов в Python 3.4.1, где пользователь должен ввести список разделенных запятыми слов, которые затем анализируются на частоту в образце текстового файла.Как искать текстовый файл для списка слов из пользовательского ввода?

Я в настоящее время зациклился на том, как искать введенный список слов в текстовом файле.

Сначала я попробовал:

file = input("What file would you like to open? ") 
f = open(file, 'r') 
search = input("Enter the words you want to search for (separate with commas): ").lower().split(",") 
search = [x.strip(' ') for x in search] 
count = {} 
for word in search: 
    count[word] = count.get(word,0)+1 
for word in sorted(count): 
    print(word, count[word]) 

В результате:

What file would you like to open? twelve_days_of_fast_food.txt 
Enter the words you want to search for (separate with commas): first, rings, the 
first 1 
rings 1 
the 1 

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

file = input("What file would you like to open? ") 
f = open(file, 'r') 
lines = f.readlines() 
line = f.readline() 
word = line.split() 
search = input("Enter the words you want to search for (separate with commas): ").lower().split(",") 
search = [x.strip(' ') for x in search] 
count = {} 
for word in lines: 
    if word in search: 
     count[word] = count.get(word,0)+1 
for word in sorted(count): 
    print(word, count[word]) 

Это не дало мне ничего назад. Вот что произошло:

What file would you like to open? twelve_days_of_fast_food.txt 
Enter the words you want to search for (separate with commas): first, the, rings 
>>> 

Что я делаю неправильно? Как я могу исправить эту проблему?

ответ

1

Читает все линии первыми (в lines, затем пытались прочитать только одну строки, но файл уже дал вам все строки. В этом случае f.readline() дает пустую строку. С этого момента из сценария обречен терпеть неудачу, вы не можете рассчитывать слова в пустой строке

вы можете перебираем файл вместо:.

file = input("What file would you like to open? ") 

search = input("Enter the words you want to search for (separate with commas): ") 
search = [word.strip() for word in search.lower().split(",")] 

# create a dictionary for all search words, setting each count to 0 
count = dict.fromkeys(search, 0) 

with open(file, 'r') as f: 
    for line in f: 
     for word in line.lower().split(): 
      if word in count: 
       # found a word you wanted to count, so count it 
       count[word] += 1 

with оператор использует открытый файловый объект в качестве менеджера контекста, это просто означает, что это будет автоматически закрывается w курица сделана.

Цикл for line in f: выполняет итерацию по каждой отдельной строке во входном файле; это более эффективно, чем использование f.readlines(), чтобы сразу считывать все строки в память.

Я также немного очистил ваше слово для поиска и установил словарь count на один со всеми поисковыми словами, предварительно определенными на 0; это делает фактический подсчет немного легче.

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

+0

Как об использовании [collections.Counter] (https://docs.python.org/2/library/collections.html#collections.Counter) на file_.readlines(). split (',')? Hmm nope, все равно нужно будет повторять каждую строку. Но возможно collection.Counter (file_.read()) пригодится? – brainovergrow

+0

@brainovergrow: 'collections.Counter()' является прекрасным дополнением, но требует импорта, а также будет толкать границы тех методов, которые OP уже знает. –

+0

@brainovergrow: 'collections.Counter (f.read(). Lower(). Split())' будет делать, а затем искать подсчеты для каждого условия поиска в этом. Но сначала фильтрация на поисковых терминах - прекрасный подход, поскольку это занимает меньше памяти. –

1

Вы можете попробовать это;

import re 
import collections 

wanted = ["cat", "dog"] 
matches = re.findall('\w+',open('hamlet.txt').read().lower()) 
counts = collections.Counter(matches) # Count each occurance of words 
map(lambda x:(x,counts[x]),wanted) # Will print the counts for wanted words 

При построении ответа я ссылался на this solution.

0

Надеюсь, что это может помочь вам просто запустите его

string = "once upon atime" 
string2 = "hello pig upon" 
word = string.split() 
word2 = string2.split() 
match = True 

while match: 

    match = False 
    for X in range(0, len(word)): 
     for Y in range(0, len(word)): 
      if word[X] == word2[Y]: 
       print(word[X]) 

       match = True 

    break #match = False