количество слов во всех файлах с использованием цикла for

Я хочу получить частоту слов для каждого файла во всех файлах в папке. Однако это не сработало.

Ошибка была следующей:

C:\Python\Anaconda3\python.exe C:/Python/Anaconda3/frequency.py Трассировка (последний последний вызов): Файл "C:/Python/Anaconda3/frequency.py", строка 6, вместо слова в файле .read().split(): NameError: имя «файл» не определено

Процесс завершен с кодом выхода 1

Как я могу сделать это эффективно? Спасибо.

import glob
import os
path = 'C:\Python\Anaconda3'
for filename in glob.glob(os.path.join(path, '*.txt')):
    wordcount = {}
    for word in file.read().split():
        if word not in wordcount:
            wordcount[word] = 1
        else:
            wordcount[word] += 1
print(word, wordcount)

person NinaJ    schedule 11.06.2017    source источник
comment
stackoverflow.com/help/how-to-ask   -  person Glen Pierce    schedule 11.06.2017
comment
Вы уверены, что glob разрешает использование widlcards? Вам не нужно открывать ('файл) перед его чтением?   -  person syntaxError    schedule 11.06.2017
comment
этот код не работает не является полезным описанием проблемы. Каким образом конкретно это не работает? В справочном центре очень четко сказано: Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для ее воспроизведения в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См. раздел Как создать минимальный, полный и проверяемый пример.   -  person Ken White    schedule 11.06.2017
comment
Возможно, это может помочь или это.   -  person Ender Look    schedule 11.06.2017
comment
Откуда ты знаешь, что он не работает? Отредактируйте вопрос со всеми деталями.   -  person Peter Wood    schedule 11.06.2017


Ответы (1)


Судя по коду, у вас есть три очевидные ошибки (хотя их может быть и больше).

  1. У вас есть цикл for, в котором вы меняете имя итератора

    for **filename** in glob.glob(os.path.join(path, '*.txt')):
        ...
        for word in **file**.read.split():
            ...
    
  2. Словарь wordcount повторно инициализируется (и, следовательно, стирается) в каждой итерации вашего цикла for. Вы можете исправить это двумя способами в зависимости от того, что вы пытаетесь получить:

    а. Переместите строку wordcount={} перед началом циклов for, чтобы предотвратить очистку словаря после каждого файла. Это даст вам общее количество wordcount для всех файлов.

    б. Добавляйте wordcount к другому словарю files после каждой итерации вашего цикла, таким образом, у вас есть словарь, где ключами являются имена файлов, а значениями являются словари, содержащие ваши слова. Это может немного сбивать с толку, потому что теперь у вас есть словарь словарей. Ссылка на отдельные слова становится filecounts[filename][word] = count.

  3. Ваш метод печати словарей неверен, вместо этого рассмотрите следующее:

    for word in wordcount:
        print('{word}:\t{count}'.format(word=word, count=wordcount[word]))
    

Я также предлагаю использовать словарь по умолчанию (см. документы, это избавит от необходимости проверять, есть ли в словаре word, и устанавливать для него значение 1.

Итак, в целом, я бы написал это:

from collections import defaultdict
import glob
import os

path = 'C:\Python\Anaconda3'
filecounts = {}

for filename in glob.glob(os.path.join(path, '*.txt')):
    wordcount = defaultdict(int)
    for word in filename.read().split():
        wordcount[word] += 1

    filecounts[filename] = wordcount

for filename in filecounts:
    print('Word count for file \'{file}\''.format(file=filename))
    for word in filecounts[filename]:
        print('\t{word}:\t{count}'.format(word=word, count=filecounts[filename][word]))
person Michael Molter    schedule 11.06.2017
comment
Строка 'print('Количество слов для файла \'{file}'\'.format(file=filename))' не работала, поэтому я отредактировал ее как 'print(Количество слов для файла\t, имя файла)' . В любом случае, я очень ценю вашу помощь. Благодарю вас! - person NinaJ; 12.06.2017
comment
Хороший улов, побег-символы всегда меня достают. - person Michael Molter; 12.06.2017
comment
Вы можете избежать defaultdict, используя обычный dict с dict.get вместо обычного поиска. wordcount = {}; wordcount[word] = wordcount.get(word, 0) + 1 - person Adam Smith; 12.06.2017
comment
Это кажется более интуитивным. Благодарю вас ! - person NinaJ; 14.06.2017
comment
@AdamSmith В чем преимущество твоей формы? Во всяком случае, это кажется менее идиоматичным? Есть ли выгода, которую я не вижу? - person Michael Molter; 14.06.2017
comment
@MichaelMolter Просто сбросил импорт stdlib, вот и все. Я бы предпочел не импортировать defaultdict, если это его единственное использование. YMMV :) - person Adam Smith; 14.06.2017