Прочитайте текстовый файл и найдите определенные слова в списке ключевых слов.

Я новичок в Python и пытаюсь создать скрипт, в котором я импортирую text_file_1, содержащий текст. Я хочу, чтобы сценарий читал основной текст и искал определенные слова, которые я определил в списке под названием (key_words), который содержит слова с заглавной буквой в начале (Нация) и строчными буквами (нация). После того, как Python выполнит поиск, он выведет список слов по вертикали в новый текстовый файл под названием «Список слов» вместе с тем, сколько раз это слово встречается в теле. Если я прочитаю text_file_2 с текстом, он сделает то же самое, но ДОБАВИТ в список слов из исходного файла.

Пример:

Список слов

Файл 1:

God: 5
Nation: 4
creater: 8
USA: 3 

Файл 2:

God: 10
Nation: 14
creater: 2
USA: 1

Вот что у меня есть до сих пор:

from sys import argv
from string import punctuation

script = argv[0] all_filenames = argv[1:]

print "Text file to import and read: " + all_filenames
print "\nReading file...\n"
text_file = open(all_filenames, 'r')
all_lines = text_file.readlines()
#print all_lines
text_file.close()

for all_filenames in argv[1:]:
   print "I get: " + all_filenames

print "\nFile read finished!"
#print "\nYour file contains the following text information:"
#print "\n" + text_file.read()

#~ for word, count in word_freq.items():
    #~ print word, count

keyWords = ['God', 'Nation', 'nation', 'USA', 'Creater', 'creater', 'Country', 'Almighty',
             'country', 'People', 'people', 'Liberty', 'liberty', 'America', 'Independence', 
             'honor', 'brave', 'Freedom', 'freedom', 'Courage', 'courage', 'Proclamation',
             'proclamation', 'United States', 'Emancipation', 'emancipation', 'Constitution',
             'constitution', 'Government', 'Citizens', 'citizens']

for word in keyWords:
    if word in word_freq:
        output_file.write( "%s: %d\n" % (word, word_freq[word]) )

output_file = open("List_of_words.txt", "w")

for word in keyWords:
    if word in word_freq:
        output_file.write( "%s: %d\n" % (word, word_freq[word]) )

output_file.close()

Может быть, использовать этот код как-то?

import fileinput
for line in fileinput.input('List_of_words.txt', inplace = True):
    if line.startswith('Existing file that was read'):
        #if line starts Existing file that was read then do something here
        print "Existing file that was read"
    elif line.startswith('New file that was read'):
        #if line starts with New file that was read then do something here
        print "New file that was read"
    else:
        print line.strip()

person Sam    schedule 14.06.2014    source источник
comment
Покажи свой код. В чем дело ?   -  person furas    schedule 14.06.2014
comment
привыкнуть к размещению кода   -  person Sam    schedule 14.06.2014
comment
Вы забыли сообщить нам, в чем проблема, с которой вам нужна помощь.   -  person Brionius    schedule 14.06.2014
comment
моя проблема в том, что я не уверен, как провести сравнение, а затем ввести его в новый файл. Я читал свои книги об этом, но это немного сбивает с толку.   -  person Sam    schedule 14.06.2014


Ответы (1)


Таким образом, у вас есть результат на экране.

from sys import argv
from collections import Counter
from string import punctuation

script, filename = argv

text_file = open(filename, 'r')

word_freq = Counter([word.strip(punctuation) for line in text_file for word in line.split()])

#~ for word, count in word_freq.items():
    #~ print word, count

key_words = ['God', 'Nation', 'nation', 'USA', 'Creater', 'creater'
             'Country', 'country', 'People', 'people', 'Liberty', 'liberty',
             'honor', 'brave', 'Freedom', 'freedom', 'Courage', 'courage']

for word in key_words:
    if word in word_freq:
        print word, word_freq[word]

Теперь вам нужно сохранить его в файл.

Для большего количества файлов используйте

for filename in argv[1:]:
   # do your job

ИЗМЕНИТЬ:

С этим кодом (my_script.py)

for filename in argv[1:]:
   print( "I get", filename )

Вы можете запустить скрипт

python my_script.py file1.txt file2.txt file3.txt 

и получить

I get file1.txt 
I get file2.txt 
I get file3.txt 

Вы можете использовать его для подсчета слов во многих файлах.

-

Используя readlines(), вы читаете все строки в память, поэтому вам нужно больше памяти - для очень-очень большого файла это может быть проблемой.

В текущей версии Counter() подсчитайте все слова во всех строках - проверьте это - но используйте меньше памяти.
Таким образом, используя readlines(), вы получите то же самое word_freq, но вы используете больше памяти.

-

writelines(list_of_result) не будет добавлять "\n" после каждой строки и не будет добавлять ":" в "God: 3"

Лучше использовать что-то похожее на

output_file = open("List_of_words.txt", "w")

for word in key_words:
    if word in word_freq:
        output_file.write( "%s: %d\n" % (word, word_freq[word]) )

output_file.close()

EDIT: новая версия - результат добавляется в конец List_of_words.txt

from sys import argv
from string import punctuation
from collections import *

keyWords = ['God', 'Nation', 'nation', 'USA', 'Creater', 'creater', 'Country', 'Almighty',
             'country', 'People', 'people', 'Liberty', 'liberty', 'America', 'Independence', 
             'honor', 'brave', 'Freedom', 'freedom', 'Courage', 'courage', 'Proclamation',
             'proclamation', 'United States', 'Emancipation', 'emancipation', 'Constitution',
             'constitution', 'Government', 'Citizens', 'citizens']


for one_filename in argv[1:]:

    print "Text file to import and read:", one_filename
    print "\nReading file...\n"

    text_file = open(one_filename, 'r')
    all_lines = text_file.readlines()
    text_file.close()

    print "\nFile read finished!"

    word_freq = Counter([word.strip(punctuation) for line in all_lines for word in line.split()])

    print "Append result to the end of file: List_of_words.txt"

    output_file = open("List_of_words.txt", "a")

    for word in keyWords:
        if word in word_freq:
            output_file.write( "%s: %d\n" % (word, word_freq[word]) )

    output_file.close()

EDIT: записать сумму результатов в один файл

from sys import argv
from string import punctuation
from collections import *

keyWords = ['God', 'Nation', 'nation', 'USA', 'Creater', 'creater', 'Country', 'Almighty',
             'country', 'People', 'people', 'Liberty', 'liberty', 'America', 'Independence', 
             'honor', 'brave', 'Freedom', 'freedom', 'Courage', 'courage', 'Proclamation',
             'proclamation', 'United States', 'Emancipation', 'emancipation', 'Constitution',
             'constitution', 'Government', 'Citizens', 'citizens']

word_freq = Counter()

for one_filename in argv[1:]:

    print "Text file to import and read:", one_filename
    print "\nReading file...\n"

    text_file = open(one_filename, 'r')
    all_lines = text_file.readlines()
    text_file.close()

    print "\nFile read finished!"

    word_freq.update( [word.strip(punctuation) for line in all_lines for word in line.split()] )

print "Write sum of results: List_of_words.txt"

output_file = open("List_of_words.txt", "w")

for word in keyWords:
    if word in word_freq:
        output_file.write( "%s: %d\n" % (word, word_freq[word]) )

output_file.close()
person furas    schedule 14.06.2014
comment
Да, я вижу это, я пробовал, и пока все работает правильно. Что я заметил, так это то, что он продолжает добавлять в список слов, а не обновлять его. Поэтому я должен выяснить, как я могу обновить его, а не продолжать добавлять каждый раз, когда я читаю один и тот же текстовый файл, а также форматировать его таким образом, чтобы он отображал прочитанный файл, а под ним отображалось количество слов. - person Sam; 15.06.2014
comment
установите w (w=write) вместо a (a=append) в open() - если вы имеете в виду обновление без summing results - person furas; 15.06.2014
comment
Если вам нужно sum of results, вам нужно изменить Counter(). Смотрите новый код в моем ответе (выше). - person furas; 15.06.2014
comment
Мне придется использовать a(a=append), потому что w перезапишет то, что уже есть в файле. Я бы хотел, чтобы он в основном читал один файл, добавлял его, а затем, если он читал другой файл, также добавлял его, но не перезаписывал, просто обновлял его ниже первого. Если я решу прочитать 3 текстовых файла, он добавит все 3 сразу, один под другим. Если он увидит, что этот же файл был прочитан, то он ничего не сделает, если он уже существует. - person Sam; 15.06.2014