associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Revisão 2e 2007-12-20 19:05:34

Excluir mensagem

ContaLetrasUnicode

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.


LucianoRamalho