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.
Esta funcion abre un archivo como objeto.
variable = open('archivo'[,'modo'],encoding='utf-8')
with open('archivo'[,'modo'],encoding='utf-8') as variable:
| Argumento | Descripcion |
|---|---|
| archivo | Nombre del archivo texto. |
| modo | r = Solo lectura (omicion) | w = solo escritura | a = agregar al final | r+ = letura y escritura |
| encoding | Se recomiendo uft-8, pero b = binario |
| Modo | Descripcion |
|---|---|
| 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. |
| x | Crea un archivo nuevo y lo abre para escritura. Si el archivo ya existe, arroja un error. |
| t | Modo texto. Por defecto. |
| b | Modo dinario. |
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
| Funcion | Descripcion |
|---|---|
| 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 |
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.
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')
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.
| Metodo | Descripcion | Origen/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 datos | archivo abierto |
| .dumps() | Convierte datos a texto | variable string |
| .load() | Lee datos | archivo abierto |
| .loads() | Convierte datos a texto | variable string |
| JSON | Python |
|---|---|
| objeto | dict |
| array | list |
| string | str |
| int | int |
| float | float |
| bolean | True|False |
| null | None |
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
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)
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 !')
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'