{"id":5882,"date":"2012-10-25T20:07:48","date_gmt":"2012-10-25T18:07:48","guid":{"rendered":"http:\/\/elclubdelautodidacta.es\/wp\/?p=5882"},"modified":"2014-01-03T13:52:15","modified_gmt":"2014-01-03T12:52:15","slug":"python-aprendiendo-a-escribir","status":"publish","type":"post","link":"http:\/\/elclubdelautodidacta.es\/wp\/2012\/10\/python-aprendiendo-a-escribir\/","title":{"rendered":"Python: Aprendiendo a escribir"},"content":{"rendered":"<p><a href=\"http:\/\/elclubdelautodidacta.es\/wp\/wp-content\/uploads\/2011\/12\/ECDA-python.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/elclubdelautodidacta.es\/wp\/wp-content\/uploads\/2011\/12\/ECDA-python.png\" alt=\"\" title=\"ECDA-python\" width=\"181\" height=\"242\" class=\"alignleft size-full wp-image-2584\" \/><\/a><em><strong>Objetivo<\/strong>: aprender el modo que tiene Python de escribir texto en un fichero.<\/em><\/p>\n<p>Si te has le\u00eddo el <a href=\"http:\/\/elclubdelautodidacta.es\/wp\/2012\/10\/python-aprendiendo-a-leer\/\" title=\"Python: Aprendiendo a leer\">anterior<\/a> art\u00edculo de esta serie, probablemente habr\u00e1s intuido la tem\u00e1tica del art\u00edculo hoy: la <strong>escritura en ficheros de texto<\/strong>.<\/p>\n<p>Todo comenz\u00f3 un d\u00eda de octubre, cuando un nuevo y sofisticado ente entr\u00f3 en escena:<\/p>\n<p><code class=\"preserve-code-formatting\">fichero = open(&#039;pruebas.txt&#039;)<\/code><\/p>\n<p>Esta instrucci\u00f3n creaba un nuevo objeto, una abstracci\u00f3n del fichero de texto real en disco, <em>pruebas.txt<\/em>, que nos permit\u00eda realizar operaciones de <strong>lectura<\/strong> sobre \u00e9l.<\/p>\n<p>En realidad, ese comando no es m\u00e1s que una forma simplificada de:<\/p>\n<p><code class=\"preserve-code-formatting\">fichero = open(&#039;pruebas.txt&#039;, &#039;rt&#039;)<\/code><\/p>\n<p>O incluso:<\/p>\n<p><code class=\"preserve-code-formatting\">fichero = open(&#039;pruebas.txt&#039;, &#039;r&#039;)<\/code><\/p>\n<p>Las letras entrecomilladas, como segundo par\u00e1metro de la funci\u00f3n <code class=\"preserve-code-formatting\">open()<\/code>, indican el <strong>modo <\/strong>en que se <em>abrir\u00e1<\/em> el fichero. La <strong>r<\/strong> (de <em>read<\/em>) y la <strong>t<\/strong> (de <em>text<\/em>) hacen referencia a que se trata de un fichero de <strong>texto <\/strong>y que s\u00f3lo realizaremos operaciones de <strong>lectura<\/strong>, no estando, por lo tanto, permitida su modificaci\u00f3n.<\/p>\n<p>Cuando no se especifica el modo de apertura, se presupone la opci\u00f3n por defecto, que es precisamente esta: <strong>texto y lectura<\/strong>.<\/p>\n<p>Hoy vamos a realizar la operaci\u00f3n inversa: la <strong>escritura de ficheros de texto<\/strong>. Para ello presentaremos un nuevo modo: <strong>&#8216;w&#8217;<\/strong>, forma simplificada de <strong>&#8216;wt&#8217;<\/strong>.<\/p>\n<p>Introduce la siguiente instrucci\u00f3n en un int\u00e9rprete interactivo:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; fichero = open(&#039;prueba2.txt&#039;, &#039;w&#039;)\n<\/code><\/pre><\/p>\n<p>Lo primero que debes saber del modo <strong>&#8216;w&#8217;<\/strong> es el efecto de esta operaci\u00f3n: si el fichero indicado <strong>no existe, lo crear\u00e1<\/strong> (naturalmente, vac\u00edo), y <strong>si ya existe lo sobreescribir\u00e1<\/strong>, perdiendo su contenido (y dej\u00e1ndolo, por lo tanto, vac\u00edo tambi\u00e9n).<\/p>\n<p>El tipo de objeto es el mismo que en el ejemplo del art\u00edculo anterior:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; type(fichero)\n&lt;class &#039;_io.TextIOWrapper&#039;&gt;<\/code><\/pre><\/p>\n<p>Con la particularidad de que <strong>las operaciones de lectura no est\u00e1n permitidas<\/strong>:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; fichero.read()\nTraceback (most recent call last):\n&nbsp;&nbsp;File &quot;&lt;pyshell#32&gt;&quot;, line 1, in &lt;module&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;fichero.read()\nio.UnsupportedOperation: not readable<\/code><\/pre><\/p>\n<p>El modo <strong>&#8216;w&#8217;<\/strong>, de <em>write<\/em>, nos permite escribir en ese fichero. El m\u00e9todo est\u00e1ndar para realizar esto es <code class=\"preserve-code-formatting\">write()<\/code>:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; fichero.write(&#039;Serie: La casa de la pradera\\nA\u00f1o: ni lo recuerdo, \\\nyo era peque\u00f1o\\n\\n\u00bfLa repondr\u00e1n? &#039;)\n81<\/code><\/pre><\/p>\n<p>He facilitado, entre comillas, un <em>string <\/em>con el texto que quiero introducir. Lo podr\u00eda haber hecho l\u00ednea a l\u00ednea, con llamadas a <code class=\"preserve-code-formatting\">write()<\/code> sucesivas, pero he optado por incluirlo todo en uno solo. Observa que, para separar una l\u00ednea de la siguiente necesito hacer uso del car\u00e1cter de escape <code class=\"preserve-code-formatting\">\\n<\/code>.<\/p>\n<p>La barra <strong>\\<\/strong> que he escrito al final de la primera l\u00ednea es para decirle al int\u00e9rprete que voy a continuar en la siguiente l\u00ednea, de modo que quede m\u00e1s presentable el c\u00f3digo. No forma parte del <em>string<\/em>.<\/p>\n<p>El m\u00e9todo <code class=\"preserve-code-formatting\">write()<\/code> devuelve un n\u00famero con el total de caracteres que han sido escritos, 81 en este caso.<\/p>\n<p>Las escrituras sucesivas <strong>contin\u00faan justo en el punto donde termin\u00f3 la \u00faltima<\/strong>:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; fichero.write(&#039;Qui\u00e9n sabe.&#039;)\n11<\/code><\/pre><\/p>\n<p>Comprobemos es aspecto de nuestro archivo de texto final. Para ello, primero hay que <strong>cerrar el fichero<\/strong>, indicando que hemos dejado de trabajar con \u00e9l, liberando la memoria ocupada y haciendo que se vuelque la informaci\u00f3n efectivamente en el disco:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; fichero.close()\n<\/code><\/pre><\/p>\n<p>Este es el contenido de <em>prueba2.txt<\/em> tras estas operaciones:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">Serie: La casa de la pradera\nA\u00f1o: ni lo recuerdo, yo era peque\u00f1o\n\n\u00bfLa repondr\u00e1n? Qui\u00e9n sabe.<\/code><\/pre><\/p>\n<p>La escritura puede ser, desde luego, en cualquier parte del fichero, no necesariamente a continuaci\u00f3n de la \u00faltima operaci\u00f3n. Podemos desplazarnos a cualquier punto empleando el m\u00e9todo <code class=\"preserve-code-formatting\">seek()<\/code> que presentamos brevemente en el \u00faltimo art\u00edculo. Veremos esto a su debido momento.<\/p>\n<p>Una operaci\u00f3n frecuente en el trabajo con ficheros en Python consiste en volcar a un archivo de texto el contenido de una secuencia. Considera, por ejemplo, la siguiente lista:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; a = [&#039;Litio\\n&#039;, &#039;Sodio\\n&#039;, &#039;Potasio\\n&#039;]\n<\/code><\/pre><\/p>\n<p>Nuestra misi\u00f3n consistir\u00e1 en crear un fichero de texto en el que figure cada elemento en una l\u00ednea diferente.<\/p>\n<p>Con lo explicado hasta el momento tenemos recursos suficientes para resolvere el problema: realizamos una <strong>iteraci\u00f3n <\/strong>sobre la lista escribiendo, en cada pasada, el elemento correspondiente:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; fichero = open(&#039;prueba2.txt&#039;, &#039;w&#039;)&nbsp;&nbsp;#El fichero antiguo se perder\u00e1\n&gt;&gt;&gt; for elemento in a:\n&nbsp;&nbsp;fichero.write(elemento)\n\n&nbsp;&nbsp;\n6\n6\n8\n&gt;&gt;&gt; fichero.close()<\/code><\/pre><\/p>\n<p>Los tres n\u00fameros devueltos por el int\u00e9rprete de comandos son, como hemos dicho, el n\u00famero de caracteres escritos tras cada operaci\u00f3n. En un programa independiente no aparecer\u00edan.<\/p>\n<p>El fichero <em>prueba2.txt<\/em> tiene el contenido buscado:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">Litio\nSodio\nPotasio<\/code><\/pre><\/p>\n<p>Cada elemento de la lista ya conten\u00eda el <code class=\"preserve-code-formatting\">\\n<\/code> al final, de modo que la siguiente escritura quedaba preparada en el punto adecuado. En el caso de no fuera as\u00ed deber\u00edas facilitarlo t\u00fa. Por ejemplo:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; b = [&#039;Fluor&#039;, &#039;Cloro&#039;, &#039;Bromo&#039;, &#039;Iodo&#039;]\n&gt;&gt;&gt; fichero = open(&#039;prueba2.txt&#039;, &#039;w&#039;)\n&gt;&gt;&gt; for elemento in b:\n&nbsp;&nbsp;fichero.write(elemento + &#039;\\n&#039;)\n\n&nbsp;&nbsp;\n6\n6\n6\n5\n&gt;&gt;&gt; fichero.close()<\/code><\/pre><\/p>\n<p>El archivo final contiene cada elemento en una l\u00ednea distinta, como puedes comprobar:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">Fluor\nCloro\nBromo\nIodo<\/code><\/pre><\/p>\n<p>En lugar de<\/p>\n<p><pre><code class=\"preserve-code-formatting\">fichero.write(elemento + &#039;\\n&#039;)\n<\/code><\/pre><\/p>\n<p>podemos recurrir a la elegancia de una <a href=\"http:\/\/elclubdelautodidacta.es\/wp\/2012\/05\/python-capitulo-34-especificaciones-de-conversion\/\" title=\"Especificaciones de conversi\u00f3n\">especificaci\u00f3n de formato<\/a>:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">fichero.write(&#039;%s\\n&#039; % elemento)\n<\/code><\/pre><\/p>\n<p>Fino, \u00bfverdad?<\/p>\n<p>Para mayor elegancia a\u00fan disponemos del m\u00e9todo <code class=\"preserve-code-formatting\">writelines()<\/code>. \u00bfRecuerdas, en el art\u00edculo anterior, que us\u00e1bamos <code class=\"preserve-code-formatting\">readlines()<\/code> para volcar un archivo de texto a una lista? Precisamente, <code class=\"preserve-code-formatting\">writelines()<\/code> hace justo lo contrario: descarga a fichero el contenido de la lista.<\/p>\n<p>Volvamos a la lista de metales alcalinos, en la que cada elemento se finalizaba con <code class=\"preserve-code-formatting\">\\n<\/code>:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; a\n[&#039;Litio\\n&#039;, &#039;Sodio\\n&#039;, &#039;Potasio\\n&#039;]<\/code><\/pre><\/p>\n<p>El m\u00e9todo <code class=\"preserve-code-formatting\">writelines() <\/code>vuelca a un un archivo el contenido de una lista (o cualquier secuencia, en general). Cada elemento se escribe a continuaci\u00f3n del anterior:<\/p>\n<p><pre><code class=\"preserve-code-formatting\">&gt;&gt;&gt; fichero = open(&#039;prueba2.txt&#039;, &#039;w&#039;)\n&gt;&gt;&gt; fichero.writelines(a)\n&gt;&gt;&gt; fichero.close()<\/code><\/pre><\/p>\n<p>&#8212;-<\/p>\n<p><pre><code class=\"preserve-code-formatting\">Litio\nSodio\nPotasio<\/code><\/pre><\/p>\n<p>La separaci\u00f3n de l\u00edneas ha sido posible porque cada elemento de la lista conten\u00eda ya el <code class=\"preserve-code-formatting\">\\n<\/code> final.<\/p>\n<p>Esto es todo por hoy. Entendidas las t\u00e9cnicas b\u00e1sicas de lectura y escritura, estamos ya en condiciones de realizar operaciones m\u00e1s avanzadas.<\/p>\n<p><strong><span style=\"color: #808080;\">Javier Montero Gabarr\u00f3<\/span><\/strong><\/p>\n<hr \/>\n<blockquote data-secret=\"GJUuIAgwlf\" class=\"wp-embedded-content\"><p><a href=\"http:\/\/elclubdelautodidacta.es\/wp\/2012\/10\/python-aprendiendo-a-escribir\/\">Python: Aprendiendo a escribir<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"display:none;\" src=\"http:\/\/elclubdelautodidacta.es\/wp\/2012\/10\/python-aprendiendo-a-escribir\/embed\/#?secret=GJUuIAgwlf\" data-secret=\"GJUuIAgwlf\" width=\"600\" height=\"338\" title=\"Entrada de WordPress incrustada\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<hr \/>\n<p>El texto de este art\u00edculo se encuentra sometido a una licencia <em>Creative Commons<\/em> del tipo <strong>CC-BY-NC-ND<\/strong> (reconocimiento, no comercial, sin obra derivada, 3.0 unported)<\/p>\n<hr \/>\n<p><em>El Club del Autodidacta<\/em><\/p>\n<hr \/>\n<p>Consulta el \u00edndice completo de art\u00edculos relacionados con <a href=\"http:\/\/elclubdelautodidacta.es\/wp\/indice-python\/\">Python<\/a>.<\/p>\n<div class=\"SPOSTARBUST-Related-Posts\"><H3>Tal vez te interese...<\/H3><ul class=\"entry-meta\"><li class=\"SPOSTARBUST-Related-Post\"><a title=\"Python &#8211; Buscando a Wally.txt\" href=\"http:\/\/elclubdelautodidacta.es\/wp\/2016\/02\/python-buscando-a-wally-txt\/\" rel=\"bookmark\">Python &#8211; Buscando a Wally.txt<\/a><\/li>\n<li class=\"SPOSTARBUST-Related-Post\"><a title=\"Python &#8211; Troceando desde el lado izquierdo\" href=\"http:\/\/elclubdelautodidacta.es\/wp\/2015\/12\/python-troceando-desde-el-lado-izquierdo\/\" rel=\"bookmark\">Python &#8211; Troceando desde el lado izquierdo<\/a><\/li>\n<li class=\"SPOSTARBUST-Related-Post\"><a title=\"Comparando objetos en Python\" href=\"http:\/\/elclubdelautodidacta.es\/wp\/2015\/06\/comparando-objetos-en-python\/\" rel=\"bookmark\">Comparando objetos en Python<\/a><\/li>\n<li class=\"SPOSTARBUST-Related-Post\"><a title=\"Python &#8211; Sumando objetos\" href=\"http:\/\/elclubdelautodidacta.es\/wp\/2015\/05\/python-sumando-objetos\/\" rel=\"bookmark\">Python &#8211; Sumando objetos<\/a><\/li>\n<li class=\"SPOSTARBUST-Related-Post\"><a title=\"Python &#8211; Una tortuga de brocha fina\" href=\"http:\/\/elclubdelautodidacta.es\/wp\/2014\/12\/python-una-tortuga-de-brocha-fina\/\" rel=\"bookmark\">Python &#8211; Una tortuga de brocha fina<\/a><\/li>\n<\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>Objetivo: aprender el modo que tiene Python de escribir texto en un fichero. Si te has le\u00eddo el anterior art\u00edculo de esta serie, probablemente habr\u00e1s intuido la tem\u00e1tica del art\u00edculo hoy: la escritura en ficheros de texto. Todo comenz\u00f3 un d\u00eda de octubre, cuando un nuevo y sofisticado ente entr\u00f3 en escena: fichero = open(&#039;pruebas.txt&#039;) &hellip; <a href=\"http:\/\/elclubdelautodidacta.es\/wp\/2012\/10\/python-aprendiendo-a-escribir\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abPython: Aprendiendo a escribir\u00bb<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[8],"tags":[393,410,503],"class_list":["post-5882","post","type-post","status-publish","format-standard","hentry","category-python","tag-escritura","tag-fichero","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1PGgv-1wS","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/posts\/5882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/comments?post=5882"}],"version-history":[{"count":12,"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/posts\/5882\/revisions"}],"predecessor-version":[{"id":7441,"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/posts\/5882\/revisions\/7441"}],"wp:attachment":[{"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/media?parent=5882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/categories?post=5882"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/elclubdelautodidacta.es\/wp\/wp-json\/wp\/v2\/tags?post=5882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}