Anuncios

Bienvenidos sean a este post, hoy veremos como trabajar internamente con archivos.

Anuncios

Vamos a ver como se puede manipular archivos con las herramientas de python, para ello vamos a crear un simple ejemplo, les recomiendo tomar el archivo prueba.txt que creamos en el post anterior pero sino quieren hasta el mismo pueden crear el archivo con la siguiente informacion:

prueba.txt

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Anuncios

Con nuestro archivo creado podemos proceder a trabajar con nuestro interprete en este ejemplo, primero vamos a importar algunas herramientas:

>>> from collections import Counter
>>> from string import ascii_letters
Anuncios

Primero importaremos a Counter desde la clase collections, luego importaremos a ascii_letters desde la clase string, con esto traeremos dos metodos que utilizaremos en un par de funciones que veremos a continuacion pero antes vamos a crear esta variable:

>>> caracteres = ascii_letters + " "
Anuncios

En este guardaremos todas las letras en formato ascii seguido de un espacio en blanco, nuestro siguiente paso sera crear dos funciones:

>>> def desinfectar(t, caracteres):
...     return ''.join(c for c in t if c in caracteres)
... 
>>> def invertir(t):
...     return t[::-1]
... 
>>>
Anuncios

La primera funcion quitara del texto informado todos los caracteres que no esten incluidos en caracteres, por ultimo tenemos una funcion que tomara el texto informado, sin informar el comienzo lo tomara desde el final y hara un retroceso, todo esto por el -1 y lo ira devolviendo, nuestro siguiente paso sera leer el archivo creado al inicio:

>>> with open('prueba.txt') as flujo:
...     lineas = [linea.rstrip() for linea in flujo]
... 
>>>
Anuncios

Este abre nuestro archivo como un objeto llamado flujo, despues almacenamos en lineas todo el contenido de flujo pero en esta ocasion usamos rstrip para eliminar todos los espacios en blanco del lado derecho de cada linea, con esto ya tenemos el objeto iterable para trabajarlo, procesemos esta informacion de la siguiente forma:

>>> with open('abeurp.txt','w') as flujo:
...     flujo.write('\n'.join(invertir(linea) for linea in lineas))
... 
857
>>>
Anuncios

En este archivo escribiremos un nuevo archivo al cual le pasaremos todo lo contenido en lineas pero a traves de la funcion invertir, de la misma forma que trabajamos hasta ahora por medio de write, le pasamos el modificador de nueva linea y luego el contenido de lineas por medio de un for pero aplicando el invertir, por ultimo si salio correctamente nos mostrara el tamaño del texto almacenado, con todo esto creado vamos a procesar uno de los archivos de la siguiente forma:

>>> lineas = [desinfectar(linea, caracteres) for linea in lineas]
>>> entero = ' '.join(lineas)
>>> contar = Counter(entero.lower().split())
>>>
Anuncios

En la primer variable usaremos a desinfectar para eliminar todos los caracteres que no sean letras y el espacio, para ello pasamos a linea y caracteres, esto gracias al bucle siguiente, el siguiente paso sera crear una variable llamada entero y le pasaremos un espacio en blanco y le pasamos el resultado almacenado en lineas, lo siguiente sera crear un objeto llamado contar donde le diremos que use a Counter sobre la variable entero pero a esta convirtiendola en minusculas y usando split para separarlas de los espacios en blanco, con nuestro objeto creado ya tenemos varias informaciones almacenadas en este, vamos a probar de obtener un dato:

>>> print(contar.most_common(3))
[('is', 10), ('better', 8), ('than', 8)]
>>>
Anuncios

En este caso le pedimos que nos muestre las tres palabras mas comunes del texto procesado en contar, observen como no solo nos devuelve cuales son sino tambien cuantas veces se repiten, por ultimo vamos a chequear como quedo nuestro archivo invertido mediante el siguiente codigo:

>>> with open('abeurp.txt') as fr:
...     for linea in fr:
...             print(linea.strip())
...
Anuncios

Es la misma rutina que venimos utilizando pero esta vez usamos el bucle for para obtener las lineas y usamos strip para eliminar espacios en blanco innecesarios, veamos su resultado:

sreteP miT yb ,nohtyP fo neZ ehT

.ylgu naht retteb si lufituaeB
.ticilpmi naht retteb si ticilpxE
.xelpmoc naht retteb si elpmiS
.detacilpmoc naht retteb si xelpmoC
.detsen naht retteb si talF
.esned naht retteb si esrapS
.stnuoc ytilibadaeR
.selur eht kaerb ot hguone laiceps t'nera sesac laicepS
.ytirup staeb ytilacitcarp hguohtlA
.yltnelis ssap reven dluohs srorrE
.decnelis ylticilpxe sselnU
.sseug ot noitatpmet eht esufer ,ytiugibma fo ecaf eht nI
.ti od ot yaw suoivbo-- eno ylno ylbareferp dna --eno eb dluohs erehT
.hctuD er'uoy sselnu tsrif ta suoivbo eb ton yam yaw taht hguohtlA
.reven naht retteb si woN
.won *thgir* naht retteb netfo si reven hguohtlA
.aedi dab a s'ti ,nialpxe ot drah si noitatnemelpmi eht fI
.aedi doog a eb yam ti ,nialpxe ot ysae si noitatnemelpmi eht fI
!esoht fo erom od s'tel -- aedi taerg gniknoh eno era secapsemaN
>>>
Anuncios

Quedo como una invocacion a Cthulhu!!! 😄 Bromas aparte, vemos que la funcion trabajo correctamente y logrando lo que deseabamos, con esto terminamos un ejemplo simple de como se pueden manipular el contenido de los archivos ya sea para crear un efecto sobre los mismos u obtener una informacion de referencia de los mismos.

Anuncios

En resumen, hoy hemos visto como manipular archivos con todo lo visto hasta ahora, por un lado hemos visto como crear dos funciones que pueden eliminar caracteres que no necesitamos en el mismo y otra que se encarga de invertir la informacion recibida, primero vimos como crear un archivo con todo el contenido invertido del original, luego hemos visto como obtener una informacion referente al texto contenido en un archivo, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50