<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Segmentation Fault! &#187; Python</title>
	<atom:link href="http://www.segmentationfault.es/category/programacion/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.es</link>
	<description>La formulación de un problema es más importante que su solución.</description>
	<lastBuildDate>Tue, 29 Jun 2010 19:45:33 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Persistencia de objetos en Python</title>
		<link>http://www.segmentationfault.es/2009/11/persistencia-python/</link>
		<comments>http://www.segmentationfault.es/2009/11/persistencia-python/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 23:35:29 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[cPickle]]></category>
		<category><![CDATA[Pickle]]></category>
		<category><![CDATA[Serialización]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1327</guid>
		<description><![CDATA[Cuando estamos creando un programa muchas veces queremos que los datos y los resultados de la ejecución de nuestro programa no se pierdan. Es posible que el objetivo de nuestro programa sea trabajar sobre un conjunto de datos concreto que debe "mejorar" o "modificar" en cada ejecución. En este post os pretendo mostrar una forma de hacerlo posible en Python gracias a Pickle.]]></description>
			<content:encoded><![CDATA[<p>Cuando estamos creando un programa muchas veces queremos que los datos y los resultados de la ejecución de nuestro programa no se pierdan. Es posible que el objetivo de nuestro programa sea trabajar sobre un conjunto de datos concreto que debe &#8220;mejorar&#8221; o &#8220;modificar&#8221; en cada ejecución. Por lo tanto, necesitamos guardar la información en cada ejecución para poder cargarla en otra posterior ejecución.</p>
<p>Si nuestra aplicación sigue el paradigma de la orientación a objetos debemos almacenar el estado del objeto para recuperarlo a posteriori. Un posible enfoque sería almacenar toda esa información en una base de datos y trabajar así con un sistema gestor de base de datos (SGBD) como <em>MySQL</em>. Pero existe un inconveniente en este caso, que la mayoría de SGBD son relacionales y nuestro programa sigue el modelo de la orientación a objetos (OOP) y la conversión entre modelos muchas veces no es obvia.</p>
<p>La alternativa que pretendo explicaros en este post es la serialización de los objetos para que sean almacenados en ficheros de texto, dándo así persistencia a nuestras aplicaciones. Me he decidido a realizar la explicación en <em>Python</em> su excelente mecanismo para la serialización de objetos, <a href="http://en.wikipedia.org/wiki/Pickle_%28Python%29" target="_blank"><em>Pickle</em></a>.</p>
<p>Para el post he creado una sencilla clase llamada SFSaludador que se encarga de saludar al usuario imprimiendo un &#8220;Hola!&#8221; por pantalla. El objeto guardará el total de saludos y esa información se hará persistente en un fichero llamaso &#8220;sfsaludador.txt&#8221; serializanso mediante <em>Pickle</em>. Os dejo el código a continuación:</p>
<pre class="brush: python; title: ; notranslate">
import os
import pickle

class SFSaludador(object):
	&quot;&quot;&quot;Clase SFSludador&quot;&quot;&quot;

	def __init__(self, totalSaludos):
		super(SFSaludador, self).__init__()
		self.__totalSaludos = totalSaludos

	def saluda(self):
		&quot;&quot;&quot;Saluda&quot;&quot;&quot;
		print &quot;Hola!&quot;
		self.__totalSaludos += 1

	def getTotalSaludos(self):
		&quot;&quot;&quot;Devuelve el total de saludos&quot;&quot;&quot;
		print &quot;He saludado &quot; + str(self.__totalSaludos) + &quot; veces.&quot;

	def load(self):
		&quot;&quot;&quot;Obtiene la informacion del archivo&quot;&quot;&quot;
		dataFile = open('sfsaludador.txt','r')
		self.__totalSaludos = pickle.load(dataFile)
		dataFile.close()

	def write(self):
		&quot;&quot;&quot;Graba los datos en el fichero&quot;&quot;&quot;
		dataFile = open('sfsaludador.txt','w')
		pickle.dump( self.__totalSaludos, dataFile)
		dataFile.close()

def main():
	&quot;&quot;&quot;Main function&quot;&quot;&quot;

	miSaludador = SFSaludador(0)

	if (os.path.exists('sfsaludador.txt')):
		print(&quot;Archivos encontrados. Cargando...&quot;)
		miSaludador.load()
	else:
		print(&quot;Archivos no encontrados...&quot;)

	miSaludador.getTotalSaludos()
	miSaludador.saluda()
	miSaludador.getTotalSaludos()

	miSaludador.write()

if __name__ == '__main__':
	main()
</pre>
<p>Para ejecutar el programa utilizaremos el intérprete de Python por consola de la siguiente forma (en entornos UNIX):</p>
<pre class="brush: bash; title: ; notranslate">
python SFSaludador.py
</pre>
<p>Dónde SFSaluadador.py es el fichero con el código de nuestro programa de ejemplo.</p>
<p>La primera vez que ejecutamos el programa no encontrará ningún fichero (así nos lo comunicará nuestra aplicación) y será al final de esta ejecución cuando creará el fichero con el estado del objeto para cargarlo en siguiente ejecuciones. Si volvemos a ejecutarlo vemos como esta vez si encuentra el fichero y el total de saludos tiene en cuenta los saludos de ejecuciones anteriores.</p>
<p>A veces <em>Pickle</em> puede llegar a ser un poco lento si necesitamos serializar muchos ficheros. Para solucionar esto existe una implentación de la librería realizada en el lenguaje de programación C, llamada <em>cPickle</em>. Si queremos hacer uso de ella sin tener que realizar modificaciones en nuestro código solo debemos sustituir el import de la librería por:</p>
<pre class="brush: bash; title: ; notranslate">
import cPickle as pickle
</pre>
<p>Espero que con este breve post haya podido haceros llegar la idea de la persistencia de datos en ficheros y su implementación en el potente lenguaje <em>Python</em>. Como siempre, ¡os espero en los comentarios!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/11/persistencia-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
