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.
También te puede interesar
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.
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
| Modo | Qué hace | Si el archivo existe |
|---|---|---|
"w" | escribir | lo vacía |
"a" | añadir al final | lo conserva |
"x" | crear | FileExistsError |
"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.
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()
no me corrió
De lujo!!!! estuve un rato buscando la variable op.linesep ya que me generaba archivos sin la separación de líneas…
me sale
PermissionError: [Errno 13] Permission denied: ‘/home/vitocho/anaconda3/envs/CP-360-Weakly_linux_py369/deepl-scraper/splitES/file85ES.txt’
A mi, el comando os.linesep, me escribe una línea en blanco, y si no lo pongo ne lo escribe todo seguido
Quizá te conviene usar el caracter de salto de línea que corresponde al sistema operativo que usas como «\n»