Pregunta Python - write () versus writelines () y cadenas concatenadas


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 un solo write(), mientras tienes un "\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 usarlo en writelines()?

Python 2.7 Cuando busqué en Google la mayoría de los recursos que encontré estaban muy por encima de mi cabeza, todavía soy un laico.


76
2017-09-11 20:31


origen


Respuestas:


writelines espera una lista de cadenas, mientras write espera una sola cuerda.

line1 + "\n" + line2 fusiona esas cadenas en una sola cadena antes de pasarlo a write.

Tenga en cuenta que si tiene muchas líneas, es posible que desee utilizar "\n".join(list_of_lines).


92
2017-09-11 20:36



¿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. El constructo '\n'.join(lines) concatena (conecta) las cadenas en la lista lines y usa el caracter '\ n' como pegamento. Es más eficiente que usar el + operador.

A partir de la misma lines secuencia, 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() existió antes writelines() Fue presentado. writelines() fue presentado más tarde como una contraparte de readlines(), para que uno pueda 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 writelines() comienza 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).


90
2017-09-11 20:40



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.


-2
2017-09-17 22:18



si solo quieres guardar y cargar una lista, prueba Conservar en vinagre

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)

-2
2018-03-11 15:29



¿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()

-2
2018-02-06 07:30