Python-write() versus writelines() y cadenas concatenadas
write to a file in python (5)
¿Ejercicio 16 del libro de Zed Shaw? Puede usar los caracteres de escape de la siguiente manera:
paragraph1 = "%s /n %s /n %s /n" % (line1, line2, line3)
target.write(paragraph1)
target.close()
Así que estoy aprendiendo Python. Estoy repasando las lecciones y encontré un problema en el que tuve que condensar una gran cantidad de target.write()
en una sola write()
, mientras tenía una "/n"
entre cada variable de entrada del usuario (el objeto de write()
)
Se me ocurrio:
nl = "/n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)
Si trato de hacer:
textdoc.write(lines)
Me sale un error Pero si escribo:
textdoc.write(line1 + "/n" + line2 + ....)
Entonces funciona bien. ¿Por qué no puedo usar una cadena para una nueva línea en write()
pero puedo usarla en writelines()
?
Python 2.7 Cuando busqué en google la mayoría de los recursos que encontré fueron muy por encima de mi cabeza, todavía soy un laico.
En realidad, creo que el problema es que sus "líneas" variables son malas. Usted definió líneas como una tupla, pero creo que write () requiere una cadena. Todo lo que tiene que cambiar son sus comas en pluses (+).
nl = "/n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)
Deberia trabajar.
si solo quieres guardar y cargar una lista, prueba Pickle
Ahorro de pepinillo:
with open("yourFile","wb")as file:
pickle.dump(YourList,file)
y cargando:
with open("yourFile","rb")as file:
YourList=pickle.load(file)
writelines
espera una lista de cadenas, mientras que write
espera una sola cadena.
line1 + "/n" + line2
combina esas cadenas en una sola cadena antes de pasarla a write
.
Tenga en cuenta que si tiene muchas líneas, puede usar "/n".join(list_of_lines)
.
¿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 quieres escribir una sola cadena, puedes hacer esto con 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, se generará una excepción (por cierto, ¡demuestre errores!).
writelines(arg)
espera un argumento 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 cuerdas es lo que proporcionaste, así que las cosas funcionaron.
La naturaleza de la (s) cadena (s) no tiene importancia para ambas funciones, es decir, simplemente escriben en el archivo lo que les proporciones. La parte interesante es que writelines()
no agrega caracteres de nueva línea por sí mismo, por lo que el nombre del método en realidad 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 para escribir una lista de cadenas en un archivo y mantener 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 ti. La construcción ''/n''.join(lines)
concatena (conecta) las cadenas en las lines
la lista y utiliza el carácter'' / n ''como pegamento. Es más eficiente que usar el operador +
.
Comenzando desde la misma secuencia de lines
, terminando con el mismo resultado, 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 de generador 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 debes tener en cuenta:
write()
y readlines()
existían antes de que writelines()
se introdujera. writelines()
se introdujo más tarde como una contraparte de readlines()
, por lo que uno podría escribir fácilmente el contenido del archivo que acaba de leer a través de readlines()
:
outfile.writelines(infile.readlines())
Realmente, esta es la razón principal por la cual writelines
tiene un nombre tan confuso. Además, hoy en día, realmente no queremos usar este método nunca más. readlines()
lee el archivo completo en la memoria de su máquina antes de que writelines()
comience a escribir los datos. En primer lugar, esto puede perder 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. Hablada de forma esquemática, 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 readlines / writelines).