Подсчёт количества букв в файле с кодировкой utf8

Небольшая программа реализованная на python, которая подсчитывает количество букв в файле с кодировкой utf8. Проблем с пониманием кода не должно возникнут. Если есть вопросы, то оставляйте комментарии. Постараюсь ответить :)
Требования: python 2.6.x
Пример использования: usr@localhost:~> python countletters.py book.txt
В результате будет создан файл с названием book.txt.count.txt. Можете открыть и посмотреть на результат подсчёта :)


#encoding:utf8
#!/usr/bin/python

import sys
from operator import itemgetter
import codecs

"""
Created on 17.05.2010
Copyright (C) 2010 Alexander S. Razzhivin 
( site http://httpbots.com )

Программа подсчывает количество букв в файле с кодировкой utf8 и записывает результат 
в другой файл с именем [имя входного файла]_counts.dat
"""

def convert_dec_to_char(i):
  """
  Заменить десятичное значение символа на строковое. Функция работает с utf8
  """
  symbols = {10: u'LF', 13: u'CR', 32: u'SPACE'}
  if i in symbols:
    return symbols[i]
  return unichr(i)

def read_file(filename, encoding='utf8'):
  """
  Прочитать данные из файла
  """
  try:
    infile = open(filename)
    text = infile.read().decode(encoding)
    infile.close()
  except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
  except:
    print "Unexpected error:", sys.exc_info()[0]
    raise
  return text

def count_letters(filename):
  """
  Подсчитать количество букв в файле.
  Возвращает словарь состоящий из буквы и количество вхождения букв в документе. 
  Например {'a':2, 'b':6, ...}
  """
  text = read_file(filename) 
  letters_counts = {}
  for letter in text:
    letters_counts.setdefault(letter, 0)
    letters_counts[letter] += 1
  return letters_counts

def write_letters_count(letters_count, filename):
  """
  Записывает количество букв найденных в файле
  """
  outfile = codecs.open(filename, 'w', 'utf-8')
  outfile.write(u"%-12s%s\n" % ("Character", "Count"))
  outfile.write(u"=================\n")
      
  # сортируем словарь по значениям.
  for ch, count in sorted(letters_count.items(), key=itemgetter(1), reverse=True):
    ordnum = ord(ch)
    outfile.write(u'%-12s%d\n' % (convert_dec_to_char(ordnum), count))
  
  outfile.close()
  
def main():  
  args = sys.argv[1:]

  if not args:
    print 'Count words in file with utf8 encoding and write result to file.count.txt'
    print 'usage: file [file ...]'
    sys.exit(1)
     
  for arg in args: 
      letters_count = count_letters(arg)
      write_letters_count(letters_count, arg+".count.txt")

if __name__ == '__main__':
  main()
Логин Регистрация

Логин

Облако тэгов

count count all django django admin feedparser libxml2dom linux mysql parser payway python pyunit pyvkapi qiwi return sniffer sockets ssh ssh tunnel sublime text tdd tehtv templatetags ubuntu unittest webmoney X11 аргументы биллинг видео видеоурок видео уроки вконтакте возврат диаграмма диаграмма стека заметки инструкция комментарии композиция логические операторы мышка образование обучение операторы параметры функции парсинг переменная переменные питон платежи поток выполнения преобразование типов программирование проекты процессинг разработка разработкаразработка рекурсия сеть скрипт сниффер сокеты стек стоки тестирование тип тип данных типы урок уроки условия функция
free counters