Подсчёт количества букв в файле с кодировкой 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()
Логин
Регистрация

