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 3
Volta para CookBook.