2017-01-08 9 views
0

Я пытаюсь открыть файл и подсчитать вхождения букв.Подсчет вхождений всех букв в txtfile

До сих пор это где я нахожусь:

def frequencies(filename): 
    infile=open(filename, 'r') 
    wordcount={} 
    content = infile.read() 
    infile.close() 
    counter = {} 
    invalid = "‘'`,.?!:;-_\n—' '" 

    for word in content: 
     word = content.lower() 
     for letter in word: 
      if letter not in invalid: 
       if letter not in counter: 
        counter[letter] = content.count(letter) 
        print('{:8} appears {} times.'.format(letter, counter[letter])) 

Любая помощь будет принята с благодарностью.

ответ

0

лучшим способом является использование Numpy пакетов, пример был бы как этот

import numpy 
text = "xvasdavawdazczxfawaczxcaweac" 
text = list(text) 
a,b = numpy.unique(text, return_counts=True) 
x = sorted(zip(b,a), reverse=True) 
print(x) 

в вашем случае, вы можете объединить все ваши слова в одну строку, а затем преобразовать строку в список символ , если вы хотите чтобы удалить все, кроме символа, вы можете использовать регулярные выражения, чтобы очистить его

#clean all except character 
content = re.sub(r'[^a-zA-Z]', r'', content) 
#convert to list of char 
content = list(content) 
a,b = numpy.unique(content, return_counts=True) 
x = sorted(zip(b,a), reverse=True) 
print(x) 
0

Если вы ищете решение, не используя numpy:

invalid = set([ch for ch in "‘'`,.?!:;-_\n—' '"]) 

def frequencies(filename): 
    counter = {} 
    with open(filename, 'r') as f: 
     for ch in (char.lower() for char in f.read()): 
      if ch not in invalid: 
       if ch not in counter: 
        counter[ch] = 0 
       counter[ch] += 1 

     results = [(counter[ch], ch) for ch in counter] 
     return sorted(results) 

for result in reversed(frequencies(filename)): 
    print result 
0

Вместо этого я предлагаю использовать collections.Counter.

компактное решение

from collections import Counter 
from string import ascii_lowercase # a-z string 

VALID = set(ascii_lowercase) 

with open('in.txt', 'r') as fin: 
    counter = Counter(char.lower() for line in fin for char in line if char.lower() in VALID) 
    print(counter.most_common()) # print values in order of most common to least. 

Более читаемый решение.

from collections import Counter 
from string import ascii_lowercase # a-z string 

VALID = set(ascii_lowercase) 

with open('in.txt', 'r') as fin: 
    counter = Counter() 
    for char in (char.lower() for line in fin for char in line): 
     if char in VALID: 
      counter[char] += 1 
    print(counter) 

Если вы не хотите использовать Counter, то вы можете просто использовать dict.

from string import ascii_lowercase # a-z string 

VALID = set(ascii_lowercase) 

with open('test.txt', 'r') as fin: 
    counter = {} 
    for char in (char.lower() for line in fin for char in line): 
     if char in VALID: 
      # add the letter to dict 
      # dict.get used to either get the current count value 
      # or default to 0. Saves checking if it is in the dict already 
      counter[char] = counter.get(char, 0) + 1 
    # sort the values by occurrence in descending order 
    data = sorted(counter.items(), key = lambda t: t[1], reverse = True) 
    print(data)