Количество слов во всех файлах, использующих цикл for

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

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

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

Процесс завершен с кодом выхода 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)

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]))
Другие вопросы по тегам