Leer y escribir archivos

Para leer y escribir archivos en Python, la forma más segura y eficiente es utilizar la declaración with junto con la función open(). Esto garantiza que el archivo se cierre automáticamente al terminar, evitando pérdidas de datos o bloqueos en la memoria.

1.Funcion open()

Esta funcion abre un archivo como objeto.

variable = open('archivo'[,'modo'],encoding='utf-8')
with open('archivo'[,'modo'],encoding='utf-8') as variable:
Argumentos de open()
ArgumentoDescripcion
archivoNombre del archivo texto.
modor = Solo lectura (omicion) | w = solo escritura | a = agregar al final | r+ = letura y escritura
encodingSe recomiendo uft-8, pero b = binario
Modo de apertura
ModoDescripcion
r(Read): Modo lectura. El archivo debe existir. Por defecto.
w(Write): Modo escritura. Sobrescribe el archivo si ya existe o lo crea si no existe.
a(Append): Modo añadir. Agrega contenido al final del archivo sin borrar lo anterior
+(Read-Write): Modo actualizacion.
xCrea un archivo nuevo y lo abre para escritura. Si el archivo ya existe, arroja un error.
tModo texto. Por defecto.
bModo dinario.
El modo por defecto es rt (lectura texto).Los modos w+ y w+b abren y truncan el archivo. Los modos r+ y r+b abren el archivo sin truncar.

Es una buena práctica usar la declaración with cuando manejamos objetos archivo. Tiene la ventaja de que el archivo es cerrado apropiadamente luego de que el bloque termina, incluso si se generó una excepción. También es mucho más corto que escribir los equivalentes bloques try-finally.

with open('workfile', encoding='utf-8') as f:
   read_data = f.read()
---   
print(f.closed)     #Comprobar si cerro

Después de que un objeto de archivo es cerrado, ya sea por with o llamando a f.close(), intentar volver a usarlo fallará automáticamente.

f.close()
f.read()    #error
Funciones de archivo
FuncionDescripcion
f.read()Lee todo el archivo y retorna contenido.
f.readline()Lee una sola linea del archivo
f.write()Escribe el contenido de la cadena al archivo, retornando la cantidad de caracteres escritos.
f.tell()Retorna un entero que indica la posición actual en el archivo representada como número de bytes desde el comienzo del archivo en modo binario y un número opaco en modo texto.
f.seek(n[,pos])Cambia el puntero del archico donde pos = 0 = inicio (omicion)| 1 (actual) | 2 = fin del archivo

2. Leer contenido de archivo

Para leer el contenido de una archivo use f.read(size), el cual lee alguna cantidad de datos y los retorna como una cadena (en modo texto) o un objeto de bytes (en modo binario). size es un argumento numérico opcional. Cuando se omite size o es negativo, el contenido entero del archivo será leído y retornado; es tu problema si el archivo es el doble de grande que la memoria de tu máquina. De otra manera, son leídos y retornados como máximo size caracteres (en modo texto) o size bytes (en modo binario). Si se alcanzó el fin del archivo, f.read() retornará una cadena vacía.

f.read(size)
f.readline()

Si f.readline() retorna vario es que termino de leer el archivo

Leer todo el archivo de golpe.

f = open('prueba.txt',encoding='utf-8')
   print(f.read())
with open('prueba.txt',encoding='utf-8') as f:
   print(f.read())

Leer linea por linea.

with open('prueba.txt',encoding='utf-8') as f:
   for linea in f:
      print(linea.strip())

Leer manual por linea.

with open('prueba.txt',encoding='utf-8') as f:
   linea1 = next(f,'archivo vacio')
   print('Encabezado',linea1.strip())

Las cadenas pueden fácilmente escribirse y leerse de un archivo. Los números toman algo más de esfuerzo, ya que el método read() sólo retorna cadenas, que tendrán que ser pasadas a una función como int(), que toma una cadena como '123' y retorna su valor numérico 123. Sin embargo, cuando se quiere guardar tipos de datos más complejos como listas, tuplas, diccionarios, o instancias de clases, las cosas se ponen más complicadas.

3. Escribir un archivo

El método .write() guarda cadenas de texto en el archivo. Si usas \n, forzarás un salto de línea

with open('prueba.txt',encoding='utf-8') as f:
   f.write('Esto es una prueba\n')
with open('prueba.txt',encoding='utf-8') as f:
   tupla = ('Mily',52)
   s = str(value)        #convierte la tupla en cadena
   f.write(s)
#Modo 'w': Crea el archivo o borra su contenido anterior para escribir de cero
with open('ejemplo.txt','w',encoding='utf-8') as archivo:
    archivo.write('Hola Mundo.\n')
    archivo.write('Esta es la segunda línea.\n')

#Modo 'a': Añade contenido al final del archivo sin borrar lo que ya tiene
with open('ejemplo.txt','a',encoding='utf-8') as archivo:
    archivo.write('Este texto se añade al final.\n')

4. Crear archivo JSON

Para trabajar con archivos JSON (JavaScript Object Notation) en Python, se usa la libreria estandar JSON. Este formato es el estándar para intercambiar datos entre aplicaciones y guardar configuraciones. .dumps() simplemente serializa un objeto a un archivo tipo texto.

JSON
MetodoDescripcionOrigen/destino
.dump(obj,fp,*,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,default=None,sort_keys=False,**kw)Escribe datosarchivo abierto
.dumps()Convierte datos a textovariable string
.load()Lee datosarchivo abierto
.loads()Convierte datos a textovariable string
Traduccion decodificacion JSON
JSONPython
objetodict
arraylist
stringstr
intint
floatfloat
boleanTrue|False
nullNone
import json
x = ['Mily','Kike']
json.dumps(x)
f = open('prueba.txt','rb+',encoding='utf-8')
json.dump(x,f)
f.close()

Toma un diccionario o lista de Python y lo guarda estructurado en un archivo como JSON.

import json
datos_usuario = {
   'nombre':'Carlos',
   'edad':30,
   'hobbies':['programar','ver peliculas'],
   'vivo':True
}
with open('usuario.json','w',encoding='utf-8') as archivo:
   #indent=4 formatea el JSON para que sea fácil de leer por humanos
   json.dump(datos_usuario,archivo,indent=4,ensure_ascii=False)

Carga el contenido de un archivo JSON y lo transforma automáticamente en un diccionario o lista de Python para que puedas usarlo directamente.

import json
with open('usuario.json','r',encoding='utf-8') as archivo:
    datos = json.load(archivo)
print(datos['nombre'])        #Imprime: Carlos
print(datos['hobbies'][0])    #Imprime: programar

Convertir strings a JSON y viceversa. A veces no tienes un archivo, sino un texto que copiaste de internet o de una API.

import json
#--- De Diccionario a Texto (String) ---
persona_dict = {'id':101,'rol':'admin'}
texto_json = json.dumps(persona_dict) 
print(type(texto_json))                   #class 'str'

#--- De texto (String) a Diccionario ---
texto_recibido = '{"status": "ok", "codigo": 200}'
datos_api = json.loads(texto_recibido)
print(datos_api['status'])                #Imprime: ok

5. Crear archivo CSV

Valores Separados por Comas (CSV) es el formato más común de importación y exportación de hojas de cálculo y bases de datos.

import CSV
with open('arcvhivo.csv',newline='') as archivo:
    datos = csv.reader(archivo,delimiter=';',quotechar='"')
import csv
with open('algun.csv',newline='') as f:
   datos = csv.reader(f)
   for row in datos:
      print(row)
import csv
with open('claves.csv',newline='') as f:
   datos = csv.reader(f,delimiter=';',quoting=csv.QUOTE_NONE)
   for row in datos:
      print(row)
import csv
nombres = ['Kike','Tito','Pepe']
with open('alumnos.csv','w',newline='') as f:
   escribe = csv.writer(f)
   escribe.writerows(nombres)

7. Administra ZIP

Libreria nativa e indispensable para manejar archivos comprimidos (comprimir y descomprimir) en Python es el módulo zipfile, el cual viene preinstalado en la librería estándar del lenguaje y no requiere ninguna instalación externa.

import zipfile

No confundir con la función integrada zip(), esta sirve para agrupar elementos de diferentes iterables (como listas o tuplas) en paralelo, lo cual es un concepto completamente diferente.

import zipfile

# Abre el archivo en modo lectura ('r')
with zipfile.ZipFile('archivo.zip','r') as archivo_zip:
   # Extrae todo el contenido en el directorio actual
   archivo_zip.extractall('./destino_carpeta')
   print('Archivo descomprimido con éxito !')
import zipfile

# Crea o sobrescribe un archivo zip en modo escritura ('w')
with zipfile.ZipFile('nuevo_archivo.zip', 'w') as archivo_zip:
   # Agrega archivos individuales al contenedor comprimido
   archivo_zip.write('documento.txt')
   archivo_zip.write('imagen.png')
   print('Archivo .zip creado con éxito !')

8. Ejemplos

Algunos ejemplos.

f = open('prueba.txt','rb+',encoding='utf-8')
f.write(b'0123456789abcdef')       #Escribe 16 bytes
f.seek(5)                          #ir al 6to byte del archivo
f.read(1)                          #'5'
f.seek(-3,2)                       #Ir al 3er byte desde el fin
f.read(1)                          #'d'