Manejo de ficheros en Python 3

1. Conceptos básicos

¿Que es un fichero?

Es un conjunto de bits almacenados en un dispositivo de memoria persistente, este conjunto de información se identifica con un nombre ( El nombre del fichero ) y todos los ficheros se localizan en un directorio determinado que se conoce como ruta del fichero.

Identificados también con una extensión

¿Que operaciones permite?

Los ficheros nos permiten realizar 4 operaciones sobre ellos, que son:

  • Creación : proceso por el cual creamos un fichero en el disco.
  • Apertura : abrimos el fichero del disco para trabajar con el.
  • Cierre : lo cerramos para dejar de trabajar con el.
  • Extensión : proceso por el cual añadimos información al fichero, es posible realizar varias operaciones ala vez como creación y apertura en la misma instrucción, sin embargo es necesario abrir un fichero para poder extenderlo o también para poder cerrarlo, no se puede cerrar un fichero si todavía no lo hemos abierto.

Nota: Si lo estamos utilizando y no cerramos el fichero, no podremos trabajar con el, no pudiéndolo modificar, ya que el programa lo tendría abierto.

¿Que es el puntero del fichero?

Es un concepto por el cual podemos entender como el ordenador accede y escribe en el fichero correctamente. Imaginaros el puntero como el lugar donde ponemos nuestro dedo o fijamos la vista mientras leemos o escribimos.

Si el puntero se encuentra al principio del fichero y escribimos y existe ya información esta se sobrescribirá, por lo tanto es interesante que el puntero se encuentre al final o después de la información ya existente como es lógico.

Diferencia entre ficheros de texto y ficheros binarios

Si creamos un fichero con un editor de texto luego lo podemos abrir cómodamente para seguir trabajando, como cuando creamos un script de python y esto es porque los editores guardan información en fichero de texto plano, tal como nosotros los escribimos.

¿Pero que ocurre si intentamos abrir una imagen o sonido con el editor? aparecerán códigos extraños, esto se debe porque estos ficheros no almacenan texto plano, sino datos binarios.

Los datos binarios son la forma mas básica de dato que un ordenador puede manejar y por tanto la forma mas rápida de escribir y leer un fichero.

2. Ficheros de texto

Si vamos abrir un fichero desde un script, tendremos que importar la librería:

from io import open

Crear fichero y escribir dentro:

texto = “Una línea con texto\nOtra línea con texto\nOtra línea más abajo del todo”

fichero=open(‘fichero.txt’,’w’) # fichero.txt ruta donde lo crearemos, w indica modo de escritura, write (puntero principio)

fichero.write(texto) # Escribimos dentro del fichero el contenido de la variable texto

fichero.close() # Cuando dejamos de trabajar, cerramos el fichero siempre

Nota: si abrimos un fichero ya existente con ese nombre y en modo escritura, se eliminará el contenido al ejecutar:

fichero = open(‘fichero.txt’,’w’)

Lectura de un fichero de texto:

fichero = open(‘fichero.txt’,’r’) # Ya tenemos el fichero abierto

texto = fichero.read() # Almacenamos el contenido existente en el fichero en la variable texto

fichero.close()

print(texto)

Una línea con texto

Otra línea con texto

Se almacena como cadena de texto, pero si queremos leer todas las lineas del fichero y almacenarlas en una lista seria de la siguiente forma:

fichero = open(‘fichero.txt’,’r’)

lineas = fichero.readlines()

fichero.close()

print(lineas)

[‘Una línea con texto\n’, ‘Otra línea con texto\n’, ‘Otra línea más abajo del todo’]

print(linea[-1])

Otra línea más con texto

Añadir más contenido a un fichero de texto:

fichero = open(‘fichero.txt’,’a’) # modo append y el puntero se coloca al final

fichero.write(‘\nCuarta línea del fichero’)

fichero.close()

¿Que ocurre si queremos abrir un fichero de texto inexistente en modo lectura?

fichero = open(‘fichero_inventado.txt’,’r’)

FileNotFoundError: [Errno 2] No such file or directory: ‘fichero_inventado.txt’

Si lo abrimos en modo append, se creará el fichero automáticamente y sin contenido, colocándose el puntero en el inicio del fichero de texto.

fichero = open(‘fichero_inventado.txt’,’a’)

Leer línea por línea:

Cuando ejecutemos la instrucción fichero.readline() por primera vez, mostrará la primera linea y el puntero se colocará al final de la línea, si lo volvemos a ejecutar, mostrará la segunda línea y volverá a colocar el puntero al final de la línea, así consecutivamente.

fichero = open(‘fichero.txt’,’r’)

l = fichero.readline() # Linea a Linea

l

‘Una línea con texto\n’

l = fichero.readline()

l

‘Otra línea con texto\n’

fichero.readline()

‘Otra línea más con texto\n’

‘Cuarta línea del fichero’

fichero.close()

Lectura línea por línea de forma secuencial:

with open(‘fichero.txt’,’r’) as fichero:

for linea in fichero:

print(linea)

3. Manejo del puntero

fichero = open(‘fichero.txt’,’r’)

fichero.seek(0) # Puntero al principio
fichero.read(10) # Leemos 10 caracteres

‘Una línea ‘

fichero.read(10) # Leemos 10 caracteres más, a partir del 10 donde está el puntero

‘con texto\n’

fichero.seek(0)

fichero.seek( len(fichero.readline()) ) # Leemos la primera línea y situamos el puntero al principio de la segunda

20

fichero.read() # Leemos todo lo que queda del puntero hasta el final

‘\nOtra línea con texto\nOtra línea más abajo del todo’

Modo de lectura y escritura a la vez:

fichero = open(‘fichero.txt’,’r+’)

fichero.write(‘abcdef’)

fichero.close()

‘abcdefnea con texto’

‘Otra línea con texto’

‘Otra línea más con texto’

Nota: esto sería equivalente a hacer un modo append y colocar el cursor en el principio.

Modificar una línea en especial:

fichero = open(‘fichero.txt’,’r+’)

lineas = fichero.readlines()

lineas

[‘abcdefnea con texto\n,

‘Otra línea con texto\n,

‘Otra línea más con texto\n’,

‘Cuarta línea del fichero’]

lineas[2] = “Esta línea se ha modificado en memoria\n” # Modificar la linea 3

fichero.seek(0) # Colocar el puntero al comienzo

fichero.writelines(lineas) # Escribimos la lista de lineas

fichero.close()

 

4. Módulo Pickle

Guardar estructura en un fichero binario

import pickle

lista = [1,2,3,4,5] # Podemos guardar lo que queramos, listas, diccionarios, tuplas…

fichero = open(‘lista.pckl’,’wb’) # Escritura en modo binario, vacía el fichero si existe

pickle.dump(lista, fichero) # Escribe la estructura en el fichero

fichero.close()

Recuperar estructura del fichero binario

fichero = open(‘lista.pckl’,’rb’) # Lectura en modo binario

lista_fichero = pickle.load(fichero)

print(lista_fichero)

[1, 2, 3, 4, 5]

 

Lógica para trabajar con objetos

  1. Crear una colección
  2. Introducir los objetos en la colección
  3. Guardar la colección haciendo un dump
  4. Recuperar la colección haciendo un load
  5. Seguir trabajando con nuestros objetos

class Persona:

def __init__(self,nombre):

self.nombre = nombre

def __str__(self):

return self.nombre

nombres = [“Charlie”,“Maria”,“Marta”]

personas = []

for n in nombres:

p = Persona(n)

personas.append(p)

import pickle

f = open(‘personas.pckl’,‘wb’)

pickle.dump(personas, f)

f.close()

 

f = open(‘personas.pckl’,’rb’)
personas = pickle.load(f)
f.close()
for p in personas:
print(p)

Charlie

Maria

Marta

5. Ejemplo catálogo de películas persistente

from io import open
import pickle

class Pelicula:

# Constructor de clase
def __init__(self, titulo, duracion, lanzamiento):

self.titulo = titulo
self.duracion = duracion
self.lanzamiento = lanzamiento
print(‘Se ha creado la película:’,self.titulo)

def __str__(self):

return ‘{} ({})’.format(self.titulo, self.lanzamiento)

class Catalogo:

peliculas = []

# Constructor de clase
def __init__(self):

self.cargar()

def agregar(self,p):

self.peliculas.append(p)
self.guardar()

def mostrar(self):

if len(self.peliculas) == 0:

print(“El catálogo está vacío”)
return

for p in self.peliculas:

print(p)

def cargar(self):

fichero = open(‘catalogo.pckl’, ‘ab+’)

fichero.seek(0)

try:

self.peliculas = pickle.load(fichero)

except:

print(“El fichero está vacío”)

finally:

fichero.close

print(“Se han cargado {} películas”.format( len(self.peliculas) ))

def guardar(self):

fichero = open(‘catalogo.pckl’, ‘wb’)

pickle.dump(self.peliculas, fichero)

fichero.close()

# Destructor de clase

def __del__(self):

self.guardar() # guardado automático

print(“Se ha guardado el fichero”)

Creando un objeto catálogo

c = Catalogo()

El fichero está vacío

Se han cargado 0 películas

c.mostrar()

El catálogo está vacío

c.agregar( Pelicula(“Scary Movie 1”, 88, 2000) )

Se ha creado la película: Scary Movie 1

c.agregar( Pelicula(“Scary Movie 2”, 83, 2001) )

Se ha creado la película: Scary Movie 2

c.mostrar()

Scary Movie 1 (2000)

Scary Movie 2 (2001)

Recuperando el catálogo al crearlo de nuevo

c = Catalogo()

Se han cargado 2 películas

c.mostrar()

Scary Movie 1 (2000)

Scary Movie 2 (2001)

del(c)

Se ha guardado el fichero

c = Catalogo()

Se han cargado 2 películas

c.agregar( Pelicula(“Scary Movie 3”, 84, 2003) )

Se ha creado la película: Scary Movie 3

c.mostrar()

Scary Movie 1 (2000)

Scary Movie 2 (2001)

Scary Movie (2003)

Aviso: si queremos leer un fichero que no se ha escrito directamente con Python, posiblemente nos encontremos con errores de codificación a la hora de mostrar algunos caracteres.

La solución será indicar manualmente la codificación en la apertura del open como argumento, ejemplo:

open(. . ., encoding=“utf8”)

Autor entrada: CharlieJ

Deja un comentario

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