Как мне сделать так, чтобы я мог читать текстовый файл только для определенных слов?

Как заставить мой код читать только определенные слова в текстовом файле и отображать слово и количество (количество раз, когда слово появляется в текстовом файле)?

from collections import Counter
import re

def openfile(filename):
 fh = open(filename, "r+")
 str = fh.read()
 fh.close()
 return str

def removegarbage(str):
 str = re.sub(r'\W+', ' ', str)
 str = str.lower()
 return str

def getwordbins(words):
 cnt = Counter()
 for word in words:
    cnt[word] += 1
 return cnt

 def main(filename, topwords):
   txt = openfile(filename)
   txt = removegarbage(txt)
   words = txt.split(' ')
   bins = getwordbins(words)
   for key, value in bins.most_common(topwords):
    print key,value

  main('filename.txt', 10)

4 ответа

Я думаю, что вы ищете простую словарную структуру. Это позволит вам не только отслеживать слова, которые вы ищете, но и их значение.

Словарь хранит вещи как пары ключ / значение. Так, например, у вас может быть ключ "alice" (слово, которое вы хотите найти, и установите его значение равным количеству раз, которое вы нашли это ключевое слово).

Самый простой способ проверить, есть ли что-то в вашем словаре, с помощью Python in ключевое слово. т.е.

if 'pie' in words_in_my_dict: do something

С этой информацией, установка счетчика слов довольно проста!

def get_word_counts(words_to_count, filename):
    words = filename.split(' ')
    for word in words:
        if word in words_to_count:
            words_to_count[word] += 1
    return words_to_count

if __name__ == '__main__':

    fake_file_contents = (
        "Alice's Adventures in Wonderland (commonly shortened to "
        "Alice in Wonderland) is an 1865 novel written by English"
        " author Charles Lutwidge Dodgson under the pseudonym Lewis"
        " Carroll.[1] It tells of a girl named Alice who falls "
        "down a rabbit hole into a fantasy world populated by peculiar,"
        " anthropomorphic creatures. The tale plays with logic, giving "
        "the story lasting popularity with adults as well as children."
        "[2] It is considered to be one of the best examples of the literary "
        "nonsense genre,[2][3] and its narrative course and structure, "
        "characters and imagery have been enormously influential[3] in "
        "both popular culture and literature, especially in the fantasy genre."
        )

    words_to_count = {
        'alice' : 0,
        'and' : 0,
        'the' : 0
        }

    print get_word_counts(words_to_count, fake_file_contents)

Это дает вывод:

{'and': 4, 'the': 5, 'alice': 0}

Так как dictionary хранит как слова, которые мы хотим сосчитать, так и время их появления. Весь алгоритм просто проверяет, находится ли каждое слово в dictи, если окажется, что мы есть, мы добавим 1 к значению этого слова.

Читайте на словарях здесь.

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

Если вы хотите посчитать все слова, а затем найти определенный набор, словари все еще хороши (и быстры!) Для этой задачи.

Единственное изменение, которое нам нужно сделать, это сначала проверить, если словарь key существует, и если нет, добавьте его к диктату.

пример

def get_all_word_counts(filename):
    words = filename.split(' ')

    word_counts = {}
    for word in words: 
        if word not in word_counts:     #If not already there
            word_counts[word] = 0   # add it in.
        word_counts[word] += 1          #Increment the count accordingly
    return word_counts

Это дает вывод:

and : 4
shortened : 1
named : 1
popularity : 1
peculiar, : 1
be : 1
populated : 1
is : 2
(commonly : 1
nonsense : 1
an : 1
down : 1
fantasy : 2
as : 2
examples : 1
have : 1
in : 4
girl : 1
tells : 1
best : 1
adults : 1
one : 1
literary : 1
story : 1
plays : 1
falls : 1
author : 1
giving : 1
enormously : 1
been : 1
its : 1
The : 1
to : 2
written : 1
under : 1
genre,[2][3] : 1
literature, : 1
into : 1
pseudonym : 1
children.[2] : 1
imagery : 1
who : 1
influential[3] : 1
characters : 1
Alice's : 1
Dodgson : 1
Adventures : 1
Alice : 2
popular : 1
structure, : 1
1865 : 1
rabbit : 1
English : 1
Lutwidge : 1
hole : 1
Carroll.[1] : 1
with : 2
by : 2
especially : 1
a : 3
both : 1
novel : 1
anthropomorphic : 1
creatures. : 1
world : 1
course : 1
considered : 1
Lewis : 1
Charles : 1
well : 1
It : 2
tale : 1
narrative : 1
Wonderland) : 1
culture : 1
of : 3
Wonderland : 1
the : 5
genre. : 1
logic, : 1
lasting : 1

Примечание: как вы можете видеть, когда мы split(' ') файл. В частности, к некоторым словам добавляются открывающая или закрывающая скобка. Вы должны будете учитывать это при обработке файлов... но я оставляю это для вас, чтобы разобраться!

Я думаю, что выполнение многих функций слишком сложно, почему бы не сделать это в одной функции?

# def function if desired
# you may have the filepath/specific words etc as parameters

 f = open("filename.txt")
 counter=0
 for line in f:
     # you can remove punctuation, translate them to spaces,
     # now any interesting words will be surrounded by spaces and
     # you can detect them
     line = line.translate(maketrans(".,!? ","     "))
     words = line.split() # splits on any number of whitespaces
     for word in words:
         if word == specificword:
             # of use a list of specific words: 
             # if word in specificwordlist:
             counter+=1
             print word
             # you could also append the words to some list, 
             # create a dictionary etc
 f.close()

Генератор, который выдает все слова в файле, пригодится:

from collections import Counter
import re

def words(filename):
    regex = re.compile(r'\w+')
    with open(filename) as f:
        for line in f:
            for word in regex.findall(line):
                yield word.lower()

Тогда либо:

wordcount = Counter(words('filename.txt'))               
for word in ['foo', 'bar']:
    print word, wordcount[word]

или же

words_to_count = set(['foo', 'bar'])
wordcount = Counter(word for word in words('filename.txt') 
                    if word in words_to_count)               
print wordcount.items()

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

interesting_words = ["ipsum","dolor"]

some_text = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec viverra consectetur sapien, sed posuere sem rhoncus quis. Mauris sit amet ligula et nulla ultrices commodo sed sit amet odio. Nullam vel lobortis nunc. Donec semper sem ut est convallis posuere adipiscing eros lobortis. Nullam tempus rutrum nulla vitae pretium. Proin ut neque id nisi semper faucibus. Sed sodales magna faucibus lacus tristique ornare.
"""

d = Counter(some_text.split())
final_list = filter(lambda item:item[0] in interesting_words,d.items())

однако его сложность не удивительна, так что это может занять некоторое время для больших файлов и / или больших списков "интересных_слов"

Другие вопросы по тегам