2015-05-28 3 views
0

Я хотел бы создать коллекцию.Counter-объект из текстового файла с частотой слов. То есть, у меня есть файл «counts.txt»:Python Counter from txt file

rank wordform   abs  r  mod 
    1 the   225300 29 223066.9 
    2 and   157486 29 156214.4 
    3 to   134478 29 134044.8 
... 
999 fallen   345 29  326.6 
1000 supper   368 27  325.8 

Я хотел бы объект счетчика wordCounts таким образом, что я могу назвать

>>> print wordCounts.most_common(3) 
[('the', 225300), ('of', 157486), ('and', 134478)] 

Что является наиболее эффективным, Pythonic способ

+1

ли поля в файле разделенных табуляцией, запятой, или что-то другое? –

ответ

1

Вот две версии. Первый принимает ваш counts.txt как обычный текстовый файл. Второй относится к нему как к CSV-файлу (что похоже на него).

from collections import Counter 

with open('counts.txt') as f: 
    lines = [line.strip().split() for line in f] 
    wordCounts = Counter({line[1]: int(line[2]) for line in lines[1:]}) 
    print wordCounts.most_common(3) 

Если файл данных, как некоторые оказались быть разграничены непротиворечивый характер или строку, которую вы могли бы использовать csv.DictReader объект для разбора файла.

Показано, что это может быть сделано IF Ваш файл TAB с разделителем.

Файл данных (в редакции мне быть TAB разделителями)

rank wordform abs r mod 
1 the 225300 29 223066.9 
2 and 157486 29 156214.4 
3 to 134478 29 134044.8 
999 fallen 345 29 326.6 
1000 supper 368 27 325.8 

Код

from csv import DictReader 
from collections import Counter 

with open('counts.txt') as f: 
    reader = DictReader(f, delimiter='\t') 
    wordCounts = Counter({row['wordform']: int(row['abs']) for row in reader}) 
    print wordCounts.most_common(3) 
+0

Хороший sol'n, но я бы назвал 'print wordCounts.most_common (3)' после закрытия файла :) – BoltzmannBrain

+0

Все, что вам нужно сделать в этом случае, - это отрыв от последнего линия. –

2
import collections.Counter 

words = dict() 
fp = open('counts.txt') 

for line in fp: 
    items = line.split() 
    words[items[1].strip()] = int(items[2].strip()) 

wordCounts = collections.Counter(words) 
+0

Мне это очень нравится; чистый и простой. Но я принял ответ @ PaulRooney, потому что он лучше обрабатывает файл, используя 'with open()'. – BoltzmannBrain

+0

@ alavin89 - yep его ответ больше Pythonic –