Ficheros de texto o binarios

Apertura del fichero

El primer requisito para abrir un fichero es usar el método open() y pasarle los argumentos necesarios para que sepa qué tipo de fichero queremos abrir y dónde se encuentra. El método open() retorna un objeto fichero cuyo tipo depende de si el fichero es de texto o binario.

Su sintaxis es:

nombre_objeto_fichero = open(nombre_fichero[, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None])

Los argumentos contenidos entre corchetes son opcionales y en caso de no pasarlos se tomarán los valores por defecto.

Algunos de los argumentos mas usados son:

nombre_fichero 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ón que accede a los ficheros pueda funcionar en todas las plataformas se hace uso del método join() incluyendo dentro de los paréntesis, todas las carpetas que conforman la ruta, finalizando con el nombre de fichero.

import os.path
nombre_fichero = os.path.join(‘carpeta’,’carpeta’,…,’nombre_fichero’)

Ejemplo en MacOS/Linux:

>>> import os.path
>>> nombre_fichero = os.path.join('proyectos','python','fichero.txt')
>>> nombre_fichero
‘proyectos/python/fichero.txt'

En Windows se obtienen dos barras invertidas dado que la primera es el carácter de escape:

>>> import os.path
>>> nombre_fichero = os.path.join('proyectos','python','fichero.txt')
>>> nombre_fichero
‘proyectos\\python\\fichero.txt’

mode 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 ‘rt’.

Los modos disponibles son:

t modo texto, Python retornará el contenido del archivo como string.

b modo binario, Python retornará el contenido del archivo como bytes.

r apertura en modo de solo lectura, el fichero debe de existir o se producirá un error.

w apertura del fichero en modo de escritura, crea un fichero nuevo o lo borra si ya existe.

a apertura del fichero en modo de escritura añadiendo el nuevo contenido al final del fichero.

x creación de fichero exclusiva, se produce un error si el fichero existe.

+ El símbolo + precedido de r, w, a o x indica que el fichero se puede actualizar (lectura y escritura).

buffering es un entero opcional usado para establecer la política de uso de almacenamiento en buffer. Si no se indica, por defecto los binarios usan un tamaño fijo de buffer para el almacenamiento y ese tamaño se selecciona automáticamente. Los ficheros de texto usan almacenamiento de buffer por líneas.

Las opciones disponibles son:

0 desactiva él almacenamiento en buffer.

1 selecciona el almacenamiento en buffer por linea (solo se usa en modo texto)

Un entero mayor que 1 indica el tamaño fijo en bytes del buffer.

encoding 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.

errors es una cadena opcional que especifica cómo serán tratados los errores con el encoding y decoding.

Algunas opciones son:

strict produce un error del tipo ValueError si hay un error con el encodigo. El valor por defecto de errors, None, produce el mismo error.

ignore ignora los errores.

replace reemplaza el texto mal formado con un marcador de reemplazo, como por ejemplo ‘?’.

newline solo se aplica en modo texto y sirve para modificar la forma en la que se gestiona el final de linea.

Lectura de datos

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étodos read(), readline() y readlines() que provee el objeto obtenido con open.

nombre_objeto_fichero.read( tamaño ) lee todos los bytes del fichero hasta encontrar el carácter de fin de fichero EOF. Si se pasa el argumento opcional tamaño, lee solo la cantidad de bytes indicada en el argumento.

nombre_objeto_fichero.readline( tamaño ) lee una línea del fichero indicado. Cada línea en el fichero ha de estar delimitada por un carácter de newline. Si se pasa un valor en el argumento opcional tamaño, lee solo la cantidad de bytes indicada en el argumento.

nombre_objeto_fichero.readlines() lee todas las lineas usando readline() y devuelve una lista con ellas.

Hay que tener en cuenta que al leer una linea con readline() o todas con readlines() cada línea también devuelve el carácter de retorno de línea ‘\n’, por lo que para quitarlo habría que usar el método rstrip(‘\n’) en cada una de las líneas.

Ejemplo de lectura de un fichero de texto que contiene la palabra ‘prueba’. El fichero debe de existir en la ruta y llamarse ‘mifichero.txt’.

>>> omifichero = open('mifichero.txt')
>>> fichero = omifichero.read()
>>> print(fichero)
prueba
>>> omifichero.close()

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ón con el fichero.

Escritura de datos

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 ‘w’,’a’. Los métodos disponibles en Python para escribir son write() y writelines().

nombre_objeto_fichero.write(datos) escribe el contenido de datos en el fichero.

nombre_objeto_fichero.writelines(lista) escribe una conjunto de datos al fichero.

En el caso de que los datos a escribir no contengan el carácter de nueva línea se le puede añadir con ‘\n’.

Ejemplo de escritura en un fichero nuevo que se llamará mifichero.txt

>>> omifichero = open( 'mifichero.txt','w' )
>>> omifichero.write('Línea de prueba\n')
16
>>> omifichero.close()
>>> omifichero = open( 'mifichero.txt','r' )
>>> print(omifichero.read())
Línea de prueba
>>> omifichero.close()

El código primero abre el fichero en modo escritura, escribe una línea y cierra el fichero. Luego abre el fichero en modo lectura y muestra en pantalla su contenido.

Aprovechando el fichero ya creado, para añadir se añade otra línea.

>>> omifichero = open( 'mifichero.txt','a' )
>>> omifichero.write('Línea de prueba 2\n')
18
>>> omifichero.close()
>>> omifichero = open( 'mifichero.txt','r' )
>>> print(omifichero.read())
Línea de prueba
Línea de prueba 2
>>> omifichero.close() 

Para eso se abre otra vez el fichero, pero esta vez usando ‘a’ para añadir. Tras la apertura se escribe la nueva línea 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.

Cierre del fichero

Para cerrar el fichero se usa el método close() de la siguiente forma:

nombre_objeto_fichero.close()

Control de errores

Al operar con ficheros es fácil obtener errores ya que se podría dar el caso de que el fichero no existiera o no se pudiera crear en la ruta indicada. Además de gestionar el error también es conveniente cerrar el archivo. Lo común para operar con ficheros, es usar try para controlar los errores.

Por ejemplo, una forma de abrir un fichero evitando que el programa muestre error si el fichero no existe, es esta:

>>> try:
...     omifichero = open('fichero.txt')
...     lineas = [linea.rstrip('\n') for linea in omifichero.readlines()]
...     print(lineas)
... finally:
...     omifichero.close()
... 
['prueba']  

Aunque en este caso no se controla si se ha producido el error, solo se previene que el programa se pare. Controlando la excepción IOError se puede saber qué error se ha producido, por ejemplo, el siguiente código producirá un error porque el fichero llamado fichero1.txt no existe, mostraría el error por pantalla y seguiría la ejecución del programa.

try:
    fichero = open('fichero1.txt')
    texto = fichero.read()
    print(texto)
    fichero.close()
except IOError as error:
    print('Se ha producido el error: %s' %(error))
Se ha producido el error: [Errno 2] No such file or directory: 'fichero1.txt'

En Python el comando with ayuda encapsulando el código y cerrando automáticamente el objeto fichero al finalizar. El siguiente código abre un fichero, muestra su contenido y lo cierra:

try:
    with open('fichero.txt') as fichero:
        texto = fichero.read()
        print(texto)
except IOError as error:
    print('Se ha producido el error: %s' %(error))

Es posible verificar si existe el fichero antes de abrirlo usando el método os.path.exists(path). Este método 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:

import os.path
if os.path.exists('fichero.txt'):
    try:
        with open('fichero.txt') as fichero:
            texto = fichero.read()
            print(texto)
    except IOError as error:
        print('Se ha producido el error: %s' %(error))
else:
    print('El fichero no existe')
El fichero no existe

El método os.path.isfile(path) 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.

import os.path
path = os.path.join('proyectos','fichero.txt')
print(os.path.isfile(path))

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *