Crear archivos de texto en Python

Escribir un archivo de texto en Python cabe en una línea. Lo que conviene saber es lo de alrededor: qué pasa si ya existe, cómo añadir sin borrar y por qué hay que decir siempre la codificación.

Dos formas de hacer lo mismo. Python tiene el módulo os de toda la vida, que trabaja con cadenas, y pathlib, que trabaja con objetos Path y es lo que se recomienda hoy. Los ejemplos de esta página usan pathlib; cuando el equivalente con os es distinto, lo indicamos. Y una diferencia con la versión anterior de la página: ya no aparecen rutas como /home/decodigo/Documentos/…, que solo existían en el ordenador de quien la escribió.

En una línea

from pathlib import Path

ruta = Path("salida") / "notas.txt"
ruta.parent.mkdir(parents=True, exist_ok=True)

ruta.write_text("Primera línea\nSegunda línea\n", encoding="utf-8")
print("escrito:", ruta.stat().st_size, "bytes")
salidaescrito: 30 bytes

Treinta bytes para veintiocho caracteres: cada «í» ocupa dos en UTF-8. write_text crea el archivo si no existe y lo vacía si existe. La barra / entre Path y cadenas une rutas y pone el separador correcto en cada sistema.

Pon siempre encoding="utf-8". Sin él, Python usa la codificación del sistema, que en Windows no siempre es UTF-8. El archivo se escribe sin error, y luego en otro ordenador las eñes salen rotas. Es un parámetro y te evita un problema que tarda en aparecer.

La forma clásica: open con with

with open("salida/lista.txt", "w", encoding="utf-8") as f:
    for i in range(1, 4):
        print("línea", i, file=f)
salida['línea 1', 'línea 2', 'línea 3']

El with cierra el archivo al salir del bloque, también si salta un error a mitad. La versión anterior de esta página llamaba a file.close() a mano, y si algo fallaba antes de llegar ahí, el archivo quedaba abierto y lo último escrito podía no llegar al disco. Y print(..., file=f) escribe en el archivo y pone el salto de línea por ti.

Añadir sin borrar

with ruta.open("a", encoding="utf-8") as f:
    f.write("Tercera línea\n")
print("tras añadir:", ruta.stat().st_size, "bytes")
salidatras añadir: 45 bytes

Los modos

ModoQué haceSi el archivo existe
"w"escribirlo vacía
"a"añadir al finallo conserva
"x"crearFileExistsError
"r"leer (por omisión)—
with open("salida/notas.txt", "x", encoding="utf-8") as f:
    f.write("no debería")
salidaFileExistsError: salida/notas.txt

El modo "x" es el que hay que usar cuando sobrescribir sería un desastre: falla en vez de pisar.

Los saltos de línea: escribe \n, siempre

La versión anterior de esta página escribía "Primera línea" + os.linesep. Parece lo correcto y no lo es. En modo texto, Python ya convierte cada \n en el salto del sistema; en Windows, os.linesep vale \r\n, y su \n se convierte otra vez:

salidaos.linesep en modo texto, en Windows: b'a\r\r\n'

Un \r de más al final de cada línea. Lo simulamos aquí con newline="\r\n", que es lo que hace Python en Windows por debajo. La regla es sencilla: en modo texto, escribe \n y deja que Python se ocupe.

Más información en inglés: Create text files in Python.

Todo el código se ejecutó con Python 3.14 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.

6 comentarios en «Crear archivos de texto en Python»

  1. Gracias… Aquí está mi código
    #!/usr/local/bin/python3.6

    from tkinter import *
    import subprocess
    import os

    def ver(value):
    print(value)

    root = Tk()
    scl = Scale(
    root,
    from_=1,
    to=20,
    tickinterval=2,
    length=400,
    resolution=1,
    showvalue=NO,
    orient=’horizontal’,
    command=ver,
    label=»Velocidad del Puntero»
    )
    scl.pack(expand=YES, fill=Y)

    def velocidad():
    file = open(«/home/lcp/.sistema/programas/mouse.sh», «w»)
    file.write(«#!/bin/sh» + os.linesep)
    file.write(«xset m » + str( scl.get())+ » 1″)
    file.close()
    subprocess.run([«chmod», «+x», «/home/lcp/.sistema/programas/mouse.sh»])
    subprocess.run([«/home/lcp/.sistema/programas/mouse.sh»])

    aplicar = Button(
    root,
    text=»Aplicar»,
    command=velocidad
    )
    aplicar.pack()
    root.mainloop()

    Responder

Deja un comentario