En el curso anterior leíste y guardaste archivos de texto. Ahora vas a controlar mejor sus rutas y a distinguir la carpeta del programa del directorio desde el que lo ejecutas. Utilizarás pathlib para expresar operaciones habituales sin concatenar separadores a mano. Todas las escrituras de esta práctica se harán en una carpeta nueva.
Una ruta representa una ubicación
Path crea un objeto que describe una ruta. No abre automáticamente el archivo ni comprueba que exista. Puedes combinar rutas con el operador de división, que aquí une componentes. Esa escritura evita decidir manualmente si necesitas una barra normal o invertida según el sistema operativo.
base = Path.cwd() / "prueba_archivos" base.mkdir(exist_ok=True) ruta = base / "notas.txt" print(ruta.resolve()) «`
mkdir crea la carpeta. exist_ok=True permite que ya exista como directorio pero no convierte cualquier problema en éxito. Si hay un archivo con ese nombre o faltan permisos puede aparecer una excepción. resolve muestra una ruta absoluta que ayuda a localizar la salida y a explicar dónde estás trabajando.
Elegir el punto de referencia
Una ruta relativa se interpreta desde el directorio de trabajo. Si ejecutas el programa desde otra carpeta puede señalar a otro lugar. Cuando quieres ubicar un recurso junto al archivo Python puedes partir de Path(__file__).resolve().parent. __file__ está disponible en programas guardados como archivos pero no debes darlo por hecho en una consola interactiva.
En el inventario final permitiremos indicar la base de datos mediante un argumento. La ruta predeterminada será relativa al directorio de trabajo y la aplicación mostrará la ubicación al crearla. No esconderemos esa decisión. Si necesitas operar sobre una base concreta utiliza una ruta explícita y conserva el mismo comando en tus instrucciones.
Abrir con una intención definida
Los modos de apertura expresan qué quieres hacer. El modo r lee, w escribe sustituyendo contenido existente y x crea un archivo nuevo fallando si ya existe. Para los primeros ejercicios utilizaremos x porque protege frente a una repetición accidental. El modo a añade al final pero no es adecuado para cualquier formato estructurado.
with ruta.open("x", encoding="utf-8") as archivo:
with ruta.open("r", encoding="utf-8") as archivo: contenido = archivo.read()
print(contenido) «`
Ejecuta este bloque después del anterior solo una vez sobre una ruta nueva. Una segunda ejecución producirá FileExistsError al intentar crear de nuevo notas.txt. Ese error es intencionado. Elige otro nombre si quieres repetir. No cambies automáticamente a w para silenciarlo sin considerar qué contenido perderías.
Definir la codificación
UTF-8 permite guardar los caracteres que utilizamos en español y es una elección habitual para intercambio. Especificarla evita depender de la configuración del equipo. La codificación determina cómo se transforman caracteres en bytes. No es lo mismo que la extensión del archivo: un documento llamado notas.txt puede haberse guardado con distintas codificaciones.
Si un archivo externo no se puede decodificar no lo leas ignorando errores como primera solución. Podrías perder letras o alterar datos sin advertirlo. Averigua su origen y convierte una copia si hace falta. En el proyecto final los CSV deben cumplir una codificación documentada y los errores detendrán la importación.
Cerrar incluso cuando algo falla
El bloque with cierra el archivo al salir, también si se produce una excepción. Eso no garantiza que una operación compleja sea atómica ni que un fallo de hardware no pueda afectar a los datos. Resuelve la gestión del recurso. Más adelante distinguiremos esa responsabilidad de las transacciones de una base de datos y de las copias de seguridad.
Leer un archivo completo con read es adecuado para documentos pequeños. Si trabajas con archivos grandes puedes recorrer sus líneas sin cargarlas todas a la vez. Elige la técnica según el tamaño y la operación. No necesitas introducir una optimización compleja para las pocas filas del curso pero sí reconocer qué supuesto estás haciendo.
Explorar sin modificar
Puedes listar archivos con una expresión como base.glob("*.txt"). Antes de automatizar cambios muestra las rutas que vas a utilizar. Esa fase de inspección permite detectar una carpeta equivocada o un patrón demasiado amplio. En este curso no crearemos una herramienta que recorra todo el ordenador ni borre archivos automáticamente.
Una extensión no demuestra que el contenido sea válido. Un archivo acabado en .csv puede contener cualquier texto. La ruta te ayuda a localizarlo; el lector y la validación comprobarán su estructura. Evita mezclar esas responsabilidades. Comprobar que existe no significa que podrás abrirlo después ni que el formato será correcto.
Errores habituales
Comprobar exists y asumir que una apertura posterior no fallará deja una ventana entre ambas operaciones. Las condiciones pueden cambiar. Por eso debes seguir gestionando las excepciones al abrir. El modo x ofrece una comprobación de creación exclusiva más sólida que preguntar primero si existe y abrir después con w.
Otro fallo consiste en utilizar rutas absolutas de tu ordenador dentro de todas las funciones. Eso dificulta probar el código y compartirlo. Recibe una ruta como parámetro cuando una operación necesita un archivo. La interfaz decidirá cuál utilizar y las pruebas podrán proporcionar una carpeta temporal sin tocar tus documentos.
Lo que deberías recordar
- Path no abre el archivo por sí mismo.
- Las rutas relativas dependen del directorio de trabajo.
- El modo x evita sobrescrituras.
- Especifica la codificación y gestiona errores de apertura.
Ejercicio práctico
Crea prueba_archivos y escribe notas.txt con el modo x. Anota la ruta absoluta y confirma su contenido desde el editor. Vuelve a ejecutar la escritura y registra la excepción prevista. Comprueba que el texto original no se ha sustituido.
Crea una segunda salida llamada revision.txt con una palabra que contenga ñ y otra con tilde. Léela usando UTF-8 y compara el texto. Después ejecuta el programa desde otra carpeta indicando la ruta del archivo Python. Observa qué ocurre si base se construye desde Path.cwd.
Escribe una función guardar_nota que reciba ruta y texto. Debe utilizar el modo x y dejar que quien la llama decida cómo gestionar un archivo existente. Termina anotando qué cambia si el punto de referencia es el directorio de trabajo o la carpeta del programa. No borres ninguna carpeta para resolver la práctica.
Siguiente: Intercambiar tablas mediante CSV.








