Categorías
El Quijote Python Twitter

Tuitear El Quijote!

import re
import codecs

LIBRO = 'QUIJOTE'
num_tweet = 1
PATRON = '(W)'
LONGITUD_FRAGMENTO = 180
LONGITUD_TWEET = 140
CABECERA = '{libro} {num_tweet}. '

## Cargo el texto. El original en
## http://www.gutenberg.org/files/2000/old/2donq10.txt
## He suprimido los encabezados, incluyendo el prólogo
## de Cervantes y los sonetos, para empezar por el
## emblemático 'En un lugar de La Mancha...' ----
fichero = codecs.open('quijote.txt', 'r', 'utf-8')
quijote = fichero.read()
fichero.close()

## En este algoritmo, el texto se va recortando por
## su principio según se va usando ----
while quijote:

  ## Se toman 180 caracteres, que sobren, para recortar ----
  quijote_fragmento = quijote[:LONGITUD_FRAGMENTO]

  ## La cabecera es 'QUIJOTE 125. ', por ejemplo ----
  cabecera = CABECERA.format(libro=LIBRO, num_tweet=num_tweet)
  longitud_cabecera = len(cabecera)

  ## Esto serán los caracteres disponibles para tuitear ----
  longitud_disponible = LONGITUD_TWEET - longitud_cabecera

  ## Aquí troceamos por palabras. Si la plantilla incluye
  ## paréntesis en los grupos de captura, también se guardan
  ## los separadores. Ver documentación Python:
  ## https://docs.python.org/3.4/library/re.html ----
  pedazos_fragmento = re.split(PATRON, quijote_fragmento)

  ## Tomamos los, digamos, 20 fragmentos, y vamos quitando
  ## del final (19, 18...), hasta que el número de caracteres
  ## que quedan encajan en el espacio disponible ----
  for i in range(len(pedazos_fragmento), 0, -1):

    tweet_menguante = ''.join(pedazos_fragmento[:i])

    if len(tweet_menguante) <= longitud_disponible:
      ## Cuando ya cabe, unimos cabecera y cuerpo y listo ----
      tweet = cabecera + tweet_menguante
      num_tweet += 1
      quijote = quijote.replace(tweet_menguante, '', 1)

      ## Ya podemos salir del bucle de trozos menguantes ----
      break

  ## Aquí imprimimos el tuit, o lo guardamos en una base de datos
  ## para usarlos ya pretroceados más adelante ----
  #print(tweet)
  if num_tweet % 100 == 0: print(num_tweet)