Python подсчет слов (2 файла, содержащие слова) (1 файл для подсчета слов) (последний файл, в котором будет записано слово + количество слов) - PullRequest
0 голосов
/ 25 января 2020

2 текстовых файла, которые содержат слова (например, текст песни)

1 текстовый файл, которые содержат слова, которые я хочу считать в этих 2 файлах ^

1 текстовый файл, который будет содержать слова + счет

file1 = open(r'E:\Users\OneDrive\Desktop\python\file1.txt','r')
file2 = open(r'E:\Users\OneDrive\Desktop\python\file2.txt','r')
file3 = open(r'E:\Users\OneDrive\Desktop\python\words.txt','r')
file4 = open(r'E:\Users\OneDrive\Desktop\python\wordsInFiles.txt','w')

for word in file3:
    word = word.strip("\n")
    counter = 0
    counter2 = 0
    for line in file1:
        line = line.strip("\n")
        words = line.split()
        for w in words:
            w = w.strip()
            if(w == word):
                counter += 1
    file1.seek(0,0)
    for line in file2:
        line = line.strip("\n")
        words = line.split()
        for w in words:
            w = w.strip()
            if(w == word):
                counter2 += 1
    file4.write(word + " " + str(counter) + "\n")
    file4.write(word + " " + str(counter2) + "\n")
    file2.seek(0,0)

file1.close()
file2.close()
file3.close()
file4.close()

Это дублирует слова для меня, также счет неправильный.

спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 25 января 2020

1) Подсчитать все слова во всех файлах

2) Посмотрите файл, содержащий слова, которые вас интересуют, и найдите каждое слово в объекте Counter вы получили от шага 1

from collections import Counter

input_filenames = [
    r"E:\Users\OneDrive\Desktop\python\file1.txt",
    r"E:\Users\OneDrive\Desktop\python\file2.txt",
]
file_with_words_youre_interested_in = r"E:\Users\OneDrive\Desktop\python\file3.txt"
output_filename = r"E:\Users\OneDrive\Desktop\python\wordsInFiles.txt"


# A generator that yields all the words in a file one by one
def get_words(filename):
    with open(filename) as f:
        for line in f:
            yield from line.split()


filename_to_word_count = {
    filename: Counter(get_words(filename)) for filename in input_filenames
}

with open(file_with_words_youre_interested_in) as f:
    words_to_count = f.read().splitlines()

with open(output_filename, "w") as f:
    for word_to_count in words_to_count:
        for filename in input_filenames:
            f.write(f"{word_to_count} {filename_to_word_count[filename][word_to_count]}\n")
0 голосов
/ 25 января 2020

У кода OP есть следующие проблемы:

(1) Он проверяет буквы, а не слова со следующими строками кода:

for line in file2:
        line = line.strip("\n")
        words = line.split()
        for w in words:
            w = w.strip()
            if(w == word):

(2) Зацикливается на file1 & file2 для каждого слова (очень неэффективно).

Код Рефакторинг из-за вышеуказанных проблем

Пример использования

file1.txt

В почерке Линкольна есть пять известных копий речи, каждая из которых имеет немного другой текст и названа в честь людей, которые впервые получили их: Николая, Хэя, Эверетта, Бэнкрофта и Блисса. , Две копии, по-видимому, были написаны перед выступлением, одна из которых, вероятно, была читающей копией.

file2.txt

Когда мы снова встретимся В громе, молнии или в дождь?

When the hurlyburly's done,
When the battle's lost and won.

That will be ere the set of sun.

words.txt (допускает использование нескольких слов в строке, игнорирует пустые строки и знаки препинания)

There are 
five known copies

When the 
hurlyburly's done
When the battle's lost and won

wordsinfile. TXT

there 1
there 0
are 1
are 0
five 1
five 0
known 1
known 0
copies 2
copies 0
when 0
when 3
the 4
the 3
hurlyburlys 0
hurlyburlys 1
done 0
done 1
battles 0
battles 1
lost 0
lost 1
and 2
and 1
won 0
won 1
...