Receita: Conta Letras Unicode
Este programa conta o número de ocorrências de cada letra de A a Z em um arquivo no formato UTF-8, demonstrando o uso de dados Unicode do módulo unicodedata para a redução dos caracteres acentuados aos seus equivalentes não acentuados.
Código
1 #!/usr/bin/env python
2 # coding: utf-8
3
4 """
5 Este programa conta as ocorrências das letras de A a Z em um arquivo
6 texto em formato UTF-8, e exibe uma lista com as letras em ordem
7 decrescente de quantidade.
8
9 As letras acentuadas e letras minúsculas são convertidas para seus
10 equivalentes maiúsculos e sem acentos. O cedilha é contado como C.
11
12 Para usar, passe o nome do arquivo texto como argumento na linha de
13 comando.
14 """
15
16 import sys
17 from unicodedata import decomposition
18 from string import ascii_uppercase
19
20 ocorrencias = {}
21
22 for linha in file(sys.argv[1]):
23 for car_uni in linha.decode('utf-8'): # converter linha para unicode
24 if not car_uni.strip():
25 continue # ignorar brancos
26 try: # primeiro tentamos converter para ASCII
27 car = car_uni.encode('ascii')
28 except UnicodeEncodeError: # se não dá certo, apelamos
29 partes = decomposition(car_uni)
30 if partes: # se o caractere pode ser decomposto...
31 ascii = partes.split()[0] # a primeira parte é o código ASCII...
32 car = chr(int(ascii, 16)) # converter o ASCII hexadecimal
33 else: # se o caractere não pode ser decomposto...
34 continue # então não tem correspondente na tabela ASCII
35
36 car = car.upper() # converter para maiúsculas
37 if car in ascii_uppercase:
38 # finalmente, podemos computar a ocorrência
39 if car in ocorrencias:
40 ocorrencias[car] += 1
41 else:
42 ocorrencias[car] = 1
43
44 indice = [(qtd, car) for (car, qtd) in ocorrencias.items()]
45 indice = sorted(indice)
46
47 print 'letra ocorrencias'
48 print '----- -----------'
49 for qtd, car in reversed(indice):
50 print '%5s %11d' % (car, qtd)
Exemplo de uso
$ ./ocorrencias.py memorias-postumas.txt
letra ocorrencias
----- -----------
A 39559
E 35245
O 28534
S 20374
I 18633
R 17055
M 13891
U 13608
N 13150
D 12859
T 11707
C 10409
L 8158
P 6699
V 4810
H 3537
Q 3377
G 3313
F 2767
B 2739
Z 1183
X 925
J 823
Y 8
K 8
W 3Volta para CookBook.


