¿Por qué no puedo usar una cadena para una nueva línea en write () pero puedo usarla en writelines ()?
La idea es la siguiente: si desea escribir una sola cadena, puede hacerlo write()
. Si tiene una secuencia de cadenas, puede escribirlas todas usando writelines()
.
write(arg)
espera una cadena como argumento y la escribe en el archivo. Si proporciona una lista de cadenas, generará una excepción (por cierto, ¡nos mostrará errores!).
writelines(arg)
espera un iterable como argumento (un objeto iterable puede ser una tupla, una lista, una cadena o un iterador en el sentido más general). Se espera que cada elemento contenido en el iterador sea una cadena. Una tupla de cadenas es lo que proporcionó, por lo que las cosas funcionaron.
La naturaleza de la (s) cadena (s) no es importante para ambas funciones, es decir, simplemente escriben en el archivo lo que sea que les proporcione. La parte interesante es que writelines()
no agrega caracteres de nueva línea por sí mismo, por lo que el nombre del método puede ser bastante confuso. En realidad se comporta como un método imaginario llamado write_all_of_these_strings(sequence)
.
Lo que sigue es una forma idiomática en Python de escribir una lista de cadenas en un archivo mientras mantiene cada cadena en su propia línea:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
Esto se encarga de cerrar el archivo por usted. La construcción '\n'.join(lines)
concatena (conecta) las cadenas en la lista lines
y usa el carácter '\ n' como pegamento. Es más eficiente que usar el +
operador.
Comenzando desde la misma lines
secuencia, terminando con la misma salida, pero usando writelines()
:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
Esto hace uso de una expresión generadora y crea dinámicamente cadenas terminadas en nueva línea. writelines()
itera sobre esta secuencia de cadenas y escribe cada elemento.
Editar: Otro punto que debe tener en cuenta:
write()
y readlines()
existía antes de writelines()
ser introducido. writelines()
se introdujo más tarde como una contraparte de readlines()
, para poder escribir fácilmente el contenido del archivo que se acaba de leer mediante readlines()
:
outfile.writelines(infile.readlines())
Realmente, esta es la razón principal por la que writelines
tiene un nombre tan confuso. Además, hoy, ya no queremos usar este método. readlines()
lee el archivo completo en la memoria de su máquina antes de writelines()
comenzar a escribir los datos. En primer lugar, esto puede perder el tiempo. ¿Por qué no comenzar a escribir partes de datos mientras lee otras partes? Pero, lo más importante, este enfoque puede consumir mucha memoria. En un escenario extremo, donde el archivo de entrada es más grande que la memoria de su máquina, este enfoque ni siquiera funcionará. La solución a este problema es usar solo iteradores. Un ejemplo de trabajo:
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
Esto lee el archivo de entrada línea por línea. Tan pronto como se lee una línea, esta línea se escribe en el archivo de salida. Hablando esquemáticamente, siempre hay una sola línea en la memoria (en comparación con todo el contenido del archivo que está en la memoria en el caso del enfoque de líneas de lectura / escrituras).
lines
no es una cadena en tu ejemplo. Es una tupla que consta de seis cuerdas.