Количество слов во всех файлах, использующих цикл 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 ответ
Поскольку код стоит, у вас есть три очевидные ошибки (хотя может быть и больше).
У тебя есть
for
цикл, в котором вы меняете имя итератораfor **filename** in glob.glob(os.path.join(path, '*.txt')): ... for word in **file**.read.split(): ...
wordcount
словарь переинициализируется (и, следовательно, стирается) в каждой итерации цикла for. Вы можете исправить это двумя способами в зависимости от того, что вы пытаетесь достичь:а. Переместить линию
wordcount={}
до того, как вы начнетеfor
циклы, чтобы предотвратить очистку словаря после каждого файла. Это даст вам общееwordcount
для всех файлов.б. присоединять
wordcount
в другой словарьfiles
после каждой итерации цикла у вас есть словарь, в котором ключи - это имена файлов, а значения - словари, содержащие ваши слова. Это может немного сбить с толку, потому что теперь у вас есть словарь словарей. Ссылка на отдельные слова становитсяfilecounts[filename][word] = count
,Ваш метод печати словарей неверен, рассмотрите следующее:
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]))