{"id":72,"date":"2020-06-01T17:03:44","date_gmt":"2020-06-01T17:03:44","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=72"},"modified":"2020-06-02T17:48:06","modified_gmt":"2020-06-02T17:48:06","slug":"ficheros-de-texto-o-binarios","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=72","title":{"rendered":"Ficheros de texto o binarios"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Apertura del fichero<\/h3>\n\n\n\n<p>El primer requisito para abrir un fichero es usar el m\u00e9todo open() y pasarle los argumentos necesarios para que sepa qu\u00e9 tipo de fichero queremos abrir y d\u00f3nde se encuentra. El m\u00e9todo open() retorna un objeto fichero cuyo tipo depende de si el fichero es de texto o binario.<\/p>\n\n\n\n<p>Su sintaxis es:<\/p>\n\n\n\n<p><strong>nombre_objeto_fichero = open(nombre_fichero[, mode=\u2018r\u2019, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None])<\/strong><\/p>\n\n\n\n<p>Los argumentos contenidos entre corchetes son opcionales y en caso de no pasarlos se tomar\u00e1n los valores por defecto.<\/p>\n\n\n\n<p>Algunos de los argumentos mas usados son:<\/p>\n\n\n\n<p><strong>nombre_fichero<\/strong> es la ruta y nombre del fichero a abrir. Existe un inconveniente al crear la ruta, en Windows se usa una barra invertida para delimitar las carpetas (\\proyectos\\python\\) mientras que en MacOS o Linux se usa la barra inclinada con el mismo fin (\/proyectos\/python\/), para que la aplicaci\u00f3n que accede a los ficheros pueda funcionar en todas las plataformas se hace uso del m\u00e9todo <strong><em>join()<\/em><\/strong> incluyendo dentro de los par\u00e9ntesis, todas las carpetas que conforman la ruta, finalizando con el nombre de fichero.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import os.path\nnombre_fichero = os.path.join(\u2018carpeta\u2019,\u2019carpeta\u2019,\u2026,\u2019nombre_fichero\u2019)<\/code><\/pre>\n\n\n\n<p>Ejemplo en MacOS\/Linux:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> import os.path\n>>> nombre_fichero = os.path.join('proyectos','python','fichero.txt')\n>>> nombre_fichero\n\u2018proyectos\/python\/fichero.txt'<\/code><\/pre>\n\n\n\n<p>En Windows se obtienen dos barras invertidas dado que la primera es el car\u00e1cter de escape:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> import os.path\n>>> nombre_fichero = os.path.join('proyectos','python','fichero.txt')\n>>> nombre_fichero\n\u2018proyectos\\\\python\\\\fichero.txt\u2019<\/code><\/pre>\n\n\n\n<p><strong>mode<\/strong> es una cadena opcional que especifica el modo de apertura del fichero, por defecto se abre en modo texto y de solo lectura equivalente a \u2018rt\u2019.<\/p>\n\n\n\n<p>Los modos disponibles son:<\/p>\n\n\n\n<p><strong>t<\/strong> modo texto, Python retornar\u00e1 el contenido del archivo como string.<\/p>\n\n\n\n<p><strong>b<\/strong> modo binario, Python retornar\u00e1 el contenido del archivo como bytes.<\/p>\n\n\n\n<p><strong>r<\/strong> apertura en modo de solo lectura, el fichero debe de existir o se producir\u00e1 un error.<\/p>\n\n\n\n<p><strong>w<\/strong> apertura del fichero en modo de escritura, crea un fichero nuevo o lo borra si ya existe.<\/p>\n\n\n\n<p><strong>a<\/strong> apertura del fichero en modo de escritura a\u00f1adiendo el nuevo contenido al final del fichero.<\/p>\n\n\n\n<p><strong>x<\/strong> creaci\u00f3n de fichero exclusiva, se produce un error si el fichero existe.<\/p>\n\n\n\n<p><strong>+<\/strong> El s\u00edmbolo + precedido de r, w, a o x indica que el fichero se puede actualizar (lectura y escritura).<\/p>\n\n\n\n<p><strong>buffering<\/strong> es un entero opcional usado para establecer la pol\u00edtica de uso de almacenamiento en buffer. Si no se indica, por defecto los binarios usan un tama\u00f1o fijo de buffer para el almacenamiento y ese tama\u00f1o se selecciona autom\u00e1ticamente. Los ficheros de texto usan almacenamiento de buffer por l\u00edneas.<\/p>\n\n\n\n<p>Las opciones disponibles son:<\/p>\n\n\n\n<p><strong>0 <\/strong>desactiva \u00e9l almacenamiento en buffer.<\/p>\n\n\n\n<p><strong>1<\/strong> selecciona el almacenamiento en buffer por linea (solo se usa en modo texto)<\/p>\n\n\n\n<p>Un entero mayor que 1 indica el tama\u00f1o fijo en bytes del buffer.<\/p>\n\n\n\n<p><strong>encoding<\/strong> es el nombre del codificado usado para hacer decodificar o codificar el fichero y solo se debe usar en modo texto. El codificado usado por defecto es el de la plataforma que en el caso de Python 3 es UTF-8, pero es posible usar otro.<\/p>\n\n\n\n<p><strong>errors<\/strong> es una cadena opcional que especifica c\u00f3mo ser\u00e1n tratados los errores con el encoding y decoding.<\/p>\n\n\n\n<p>Algunas opciones son:<\/p>\n\n\n\n<p><strong>strict<\/strong> produce un error del tipo ValueError si hay un error con el encodigo. El valor por defecto de errors, None, produce el mismo error.<\/p>\n\n\n\n<p><strong>ignore<\/strong> ignora los errores.<\/p>\n\n\n\n<p><strong>replace<\/strong> reemplaza el texto mal formado con un marcador de reemplazo, como por ejemplo \u2018?\u2019.<\/p>\n\n\n\n<p><strong>newline<\/strong> solo se aplica en modo texto y sirve para modificar la forma en la que se gestiona el final de linea.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lectura de datos<\/h3>\n\n\n\n<p>Tras obtener el identificador de objeto para operar con el fichero, el siguiente paso es leer el contenido del mismo, para ello se pueden usar cualquiera de los tres m\u00e9todos read(), readline() y readlines() que provee el objeto obtenido con open.<\/p>\n\n\n\n<p><strong>nombre_objeto_fichero.read( tama\u00f1o )<\/strong> lee todos los bytes del fichero hasta encontrar el car\u00e1cter de fin de fichero EOF. Si se pasa el argumento opcional tama\u00f1o, lee solo la cantidad de bytes indicada en el argumento.<\/p>\n\n\n\n<p><strong>nombre_objeto_fichero.readline( tama\u00f1o )<\/strong> lee una l\u00ednea del fichero indicado. Cada l\u00ednea en el fichero ha de estar delimitada por un car\u00e1cter de newline. Si se pasa un valor en el argumento opcional tama\u00f1o, lee solo la cantidad de bytes indicada en el argumento.<\/p>\n\n\n\n<p><strong>nombre_objeto_fichero.readlines()<\/strong> lee todas las lineas usando readline() y devuelve una lista con ellas.<\/p>\n\n\n\n<p>Hay que tener en cuenta que al leer una linea con readline() o todas con readlines() cada l\u00ednea tambi\u00e9n devuelve el car\u00e1cter de retorno de l\u00ednea \u2018\\n\u2019, por lo que para quitarlo habr\u00eda que usar el m\u00e9todo rstrip(\u2018\\n\u2019) en cada una de las l\u00edneas.<\/p>\n\n\n\n<p>Ejemplo de lectura de un fichero de texto que contiene la palabra \u2018prueba\u2019. El fichero debe de existir en la ruta y llamarse \u2018mifichero.txt\u2019.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> omifichero = open('mifichero.txt')\n>>> fichero = omifichero.read()\n>>> print(fichero)\nprueba\n>>> omifichero.close()<\/code><\/pre>\n\n\n\n<p>Se puede observar que la variable omifichero se convierte en un objeto de fichero al usar open(), luego se lee todo el contenido del fichero usando read() y se almacena en la variable fichero para ser posteriormente mostrado en pantalla gracias a print(), omifichero.close() cierra la conexi\u00f3n con el fichero.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Escritura de datos<\/h3>\n\n\n\n<p>Si lo que se pretende es escribir en el fichero es necesario abrirlo en cualquiera de los modos destinados a este efecto, como pueden ser \u2018w\u2019,\u2019a\u2019. Los m\u00e9todos disponibles en Python para escribir son write() y writelines().<\/p>\n\n\n\n<p><strong>nombre_objeto_fichero.write(datos)<\/strong> escribe el contenido de datos en el fichero.<\/p>\n\n\n\n<p><strong>nombre_objeto_fichero.writelines(lista)<\/strong> escribe una conjunto de datos al fichero.<\/p>\n\n\n\n<p>En el caso de que los datos a escribir no contengan el car\u00e1cter de nueva l\u00ednea se le puede a\u00f1adir con \u2018\\n\u2019.<\/p>\n\n\n\n<p>Ejemplo de escritura en un fichero nuevo que se llamar\u00e1 mifichero.txt<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> omifichero = open( 'mifichero.txt','w' )\n>>> omifichero.write('L\u00ednea de prueba\\n')\n16\n>>> omifichero.close()\n>>> omifichero = open( 'mifichero.txt','r' )\n>>> print(omifichero.read())\nL\u00ednea de prueba\n>>> omifichero.close()<\/code><\/pre>\n\n\n\n<p>El c\u00f3digo primero abre el fichero en modo escritura, escribe una l\u00ednea y cierra el fichero. Luego abre el fichero en modo lectura y muestra en pantalla su contenido.<\/p>\n\n\n\n<p>Aprovechando el fichero ya creado, para a\u00f1adir se a\u00f1ade otra l\u00ednea.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> omifichero = open( 'mifichero.txt','a' )\n>>> omifichero.write('L\u00ednea de prueba 2\\n')\n18\n>>> omifichero.close()\n>>> omifichero = open( 'mifichero.txt','r' )\n>>> print(omifichero.read())\nL\u00ednea de prueba\nL\u00ednea de prueba 2\n>>> omifichero.close() <\/code><\/pre>\n\n\n\n<p>Para eso se abre otra vez el fichero, pero esta vez usando \u2018a\u2019 para a\u00f1adir. Tras la apertura se escribe la nueva l\u00ednea y se cierra el fichero. Para comprobar el resultado, se vuelve a abrir el fichero en modo solo lectura y se imprime el resultado de la lectura.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cierre del fichero<\/h3>\n\n\n\n<p>Para cerrar el fichero se usa el m\u00e9todo close() de la siguiente forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">nombre_objeto_fichero.close()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Control de errores<\/h3>\n\n\n\n<p>Al operar con ficheros es f\u00e1cil obtener errores ya que se podr\u00eda dar el caso de que el fichero no existiera o no se pudiera crear en la ruta indicada. Adem\u00e1s de gestionar el error tambi\u00e9n es conveniente cerrar el archivo. Lo com\u00fan para operar con ficheros, es usar <strong><em>try<\/em><\/strong> para controlar los errores.<\/p>\n\n\n\n<p>Por ejemplo, una forma de abrir un fichero evitando que el programa muestre error si el fichero no existe, es esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> try:\n...     omifichero = open('fichero.txt')\n...     lineas = [linea.rstrip('\\n') for linea in omifichero.readlines()]\n...     print(lineas)\n... finally:\n...     omifichero.close()\n... \n['prueba']  <\/code><\/pre>\n\n\n\n<p>Aunque en este caso no se controla si se ha producido el error, solo se previene que el programa se pare. Controlando la excepci\u00f3n <strong><em>IOError<\/em><\/strong> se puede saber qu\u00e9 error se ha producido, por ejemplo, el siguiente c\u00f3digo producir\u00e1 un error porque el fichero llamado fichero1.txt no existe, mostrar\u00eda el error por pantalla y seguir\u00eda la ejecuci\u00f3n del programa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">try:\n    fichero = open('fichero1.txt')\n    texto = fichero.read()\n    print(texto)\n    fichero.close()\nexcept IOError as error:\n    print('Se ha producido el error: %s' %(error))\nSe ha producido el error: [Errno 2] No such file or directory: 'fichero1.txt'<\/code><\/pre>\n\n\n\n<p>En Python el comando <strong><em>with<\/em><\/strong> ayuda encapsulando el c\u00f3digo y cerrando autom\u00e1ticamente el objeto fichero al finalizar. El siguiente c\u00f3digo abre un fichero, muestra su contenido y lo cierra:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">try:\n    with open('fichero.txt') as fichero:\n        texto = fichero.read()\n        print(texto)\nexcept IOError as error:\n    print('Se ha producido el error: %s' %(error))<\/code><\/pre>\n\n\n\n<p>Es posible verificar si existe el fichero antes de abrirlo usando el m\u00e9todo <strong><em>os.path.exists(path)<\/em><\/strong>. Este m\u00e9todo comprueba si existe el archivo indicado en el path devolviendo True si existe o False en caso contrario, como se ve en el siguiente ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import os.path\nif os.path.exists('fichero.txt'):\n    try:\n        with open('fichero.txt') as fichero:\n            texto = fichero.read()\n            print(texto)\n    except IOError as error:\n        print('Se ha producido el error: %s' %(error))\nelse:\n    print('El fichero no existe')\nEl fichero no existe<\/code><\/pre>\n\n\n\n<p>El m\u00e9todo <strong><em>os.path.isfile(path)<\/em><\/strong> sirve para verificar si el path que se pasa como argumento es un fichero. El siguiente ejemplo solo muestra True si existe el fichero \/proyectos\/fichero.txt, en caso contrario muestra False.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import os.path\npath = os.path.join('proyectos','fichero.txt')\nprint(os.path.isfile(path))<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Apertura del fichero El primer requisito para abrir un fichero es usar el m\u00e9todo open() y pasarle los argumentos necesarios &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,4],"tags":[34,35,2,6],"class_list":["post-72","post","type-post","status-publish","format-standard","hentry","category-ficheros","category-python","tag-ficheros","tag-path","tag-python","tag-python3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=72"}],"version-history":[{"count":2,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions"}],"predecessor-version":[{"id":78,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions\/78"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}