Entonces estoy aprendiendo Python. Estoy pasando por las lecciones y me encontré con un problema en el que tuve que condensar muchas target.write()
en una sola write()
, mientras tenía una "\n"
variable de entrada entre cada 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 write()
pero puedo usarla 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.
python
string
file-io
python-2.x
AbeLinkon
fuente
fuente
lines
no es una cadena en tu ejemplo. Es una tupla que consta de seis cuerdas.Respuestas:
writelines
espera un iterable de cadenaswrite
espera una sola cadena.line1 + "\n" + line2
combina esas cadenas en una sola cadena antes de pasarla awrite
.Tenga en cuenta que si tiene muchas líneas, es posible que desee utilizar
"\n".join(list_of_lines)
.fuente
writelines
espera un iterable. Puede usar una lista, una tupla o un generador.write
lugar dewritelines
si tiene muchas líneas? Writelines podría tener un mejor rendimiento ya que no tiene que crear una cadena concatenada temporal, simplemente iterando sobre las líneas.¿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 usandowritelines()
.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 llamadowrite_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:
Esto se encarga de cerrar el archivo por usted. La construcción
'\n'.join(lines)
concatena (conecta) las cadenas en la listalines
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 usandowritelines()
: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()
yreadlines()
existía antes dewritelines()
ser introducido.writelines()
se introdujo más tarde como una contraparte dereadlines()
, para poder escribir fácilmente el contenido del archivo que se acaba de leer mediantereadlines()
: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 dewritelines()
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: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).
fuente
write()
ywritelines()
son básicamente equivalentes y su uso también es una cuestión de gusto personal. Sin embargo, es importante tener en cuenta que para una lista extremadamente larga de cadenas (llamadalines
) es menos eficiente escribirf.write('\n'.join(lines))
quefor l in line: f.write('%s\n' % l)
. En el primer caso, se crea una cadena completamente nueva y muy larga en la memoria antes de escribirla. En el segundo caso, los datos se escriben por partes.outf.writelines(inf.readlines())
sino más bienoutf.writelines(inf)
. La función que ya no queremos usarreadlines()
no lo eswritelines()
.writelines()
, su semántica es, como se explicó, menos que ideal. Es por eso que nunca lo he usado. Y nunca me lo perdí.si solo quieres guardar y cargar una lista prueba Pickle
Ahorro de pepinillos:
y cargando:
fuente
En realidad, creo que el problema es que sus "líneas" variables son malas. Definió líneas como una tupla, pero creo que write () requiere una cadena. Todo lo que tienes que cambiar son tus comas en más (+).
Deberia trabajar.
fuente
¿Ejercicio 16 del libro de Zed Shaw? Puede usar caracteres de escape de la siguiente manera:
fuente
" \n ".join((line1, line2, line3))
.