Así que estoy aprendiendo Python. Voy a través de las lecciones y se topó con un problema en el que he tenido que condensar una gran cantidad de target.write() en una sola write(), a pesar de tener un "\n" entre cada usuario de la variable de entrada(el objeto de la write()).

Que se me ocurrió:

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 yo tipo:

textdoc.write(line1 + "\n" + line2 + ....)

Entonces funciona bien. ¿Por qué no puedo utilizar una cadena de caracteres para una nueva línea en write() pero lo puedo usar en writelines()?

Python 2.7
Cuando busqué en google la mayoría de los recursos que he encontrado estaban muy por encima de mi cabeza, todavía estoy un laicos.

InformationsquelleAutor AbeLinkon | 2012-09-11

5 Comentarios

  1. 118
    • writelines espera un iterable de las cadenas de
    • write espera una sola cadena.

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

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

    • Más específicamente, writelines espera un iterable. Usted puede utilizar una lista, tupla, o un generador.
    • Gracias por la respuesta de sir. Supongo que por el nombre (list_of_lines) que debo hacer una lista de cadenas y de paso, a continuación, en .join(lista) ?
    • ¿Por qué utilizar write en lugar de writelines si usted tiene muchas líneas? Writelines podría ser mejor rendimiento, ya que no tiene que crear un temporal de cadena concatenada, sólo la iteración a través de las líneas.
    • exactamente lo opuesto: stackoverflow.com/a/6165711/281545
  2. 108

    ¿Por qué no puedo utilizar una cadena de caracteres para una nueva línea en la escritura() pero la voy a usar en writelines()?

    La idea es la siguiente: si desea escribir una sola cadena, se puede hacer esto con write(). Si usted tiene una secuencia de cadenas de caracteres se pueden escribir todos ellos utilizando writelines().

    write(arg) espera una cadena como argumento y los escribe en el archivo. Si usted proporciona una lista de cadenas, se elevará una excepción (por cierto, mostrar los errores para nosotros!).

    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). Cada elemento contenido en el iterador se espera que sea una cadena. Una tupla de cadenas es lo que usted proporcionó, así funcionaban las cosas.

    La naturaleza de la cadena(s) no importa tanto de las funciones, es decir, que se acaba de escribir en el archivo de lo que usted les proporcione. La parte interesante es que writelines() no agregar caracteres de nueva línea en su propio, por lo que el nombre del método, en realidad puede ser bastante confuso. Se comporta realmente como un imaginario método llamado write_all_of_these_strings(sequence).

    Lo que sigue es un idiomáticas manera en Python para escribir una lista de cadenas de caracteres en un archivo, manteniendo cada uno de cadena en su propia línea:

    lines = ['line1', 'line2']
    with open('filename.txt', 'w') as f:
        f.write('\n'.join(lines))

    Esto se ocupa de cerrar el archivo para usted. La construcción de '\n'.join(lines) concatena (conecta) las cadenas en la lista lines y utiliza el carácter ‘\n’ como pegamento. Es más eficiente que el uso de la + operador.

    A partir de la misma lines secuencia, para terminar con el mismo resultado, pero el uso de writelines():

    lines = ['line1', 'line2']
    with open('filename.txt', 'w') as f:
        f.writelines("%s\n" % l for l in lines)

    Esto hace que el uso de un generador de expresión y crea dinámicamente newline cadenas terminadas. writelines() itera a través de esta secuencia de cadenas y escribe cada elemento.

    Edit: Otro punto que se debe tener en cuenta:

    write() y readlines() existía antes de writelines() fue introducido. writelines() más tarde, se incorporó como una contraparte de readlines(), de modo que uno podría fácilmente escribir el contenido del archivo que se acaba de leer a través de readlines():

    outfile.writelines(infile.readlines())

    Realmente, esta es la razón principal por la que writelines tiene un confuso nombre. También, hoy en día, que realmente no desea utilizar este método ya. readlines() lee todo el archivo a la memoria de su máquina antes de writelines() comienza a escribir los datos. Primero de todo, se puede perder el tiempo. ¿Por qué no empezar a escribir partes de los datos, mientras que la lectura de otras partes? Pero, más importante aún, este enfoque puede ser muy de la memoria que consumen. En un caso extremo, donde el archivo de entrada es más grande que la memoria de su máquina, este enfoque no funciona aún. La solución a este problema es el uso de iteradores sólo. Un ejemplo de trabajo:

    with open('inputfile') as infile:
        with open('outputfile') as outfile:
            for line in infile:
                outfile.write(line)

    Este lee el archivo de entrada de línea por línea. Tan pronto como una línea que se lee, esta línea se escribe en el archivo de salida. Esquemáticamente hablado, siempre hay una sola línea en la memoria (en comparación con todo el contenido del archivo está en la memoria en el caso de la readlines/writelines enfoque).

    • Gracias por este muy detallada respuesta. Basado en su explicación, quiero suponer que f.writelines() sería más útil en la generación de un archivo de registro y f.write() es más útil para una o varias ediciones en particular o varios archivos?
    • Yo no apoyan esta conclusión. write() y writelines() 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 muy larga de cadenas (llamado lines) es menos eficiente para escribir f.write('\n'.join(lines)) de for l in line: f.write('%s\n' % l). En el primer caso, un totalmente nuevo y de muy larga cadena que se crea en la memoria antes de escribir. En el segundo caso los datos se escriben piece-wise.
    • f.write(‘\n’.join(líneas)) no agregar el último nl cuando me encontré con él.
    • esto es de esperar, 's'.join(iterable) sólo llena los vacíos con ‘s’, no agregar prefijo/sufijo.
    • Por supuesto que no hacer outf.writelines(inf.readlines()) sino outf.writelines(inf). La función no queremos utilizar ya es readlines() no writelines().
    • aunque no hay nada malo con la funcionalidad de/aplicación de writelines(), su semántica, como se ha explicado, a menos que ideal. Esta es la razón por la que he utilizado nunca. Y nunca me falló.
    • tal vez usted debería considerar la posibilidad de aceptar esta respuesta, es claramente mejor que el que originalmente aceptado
    • esta sería la más clara con un final de salto de línea: f.write('\n'.join(lines) + '\n') para que coincida con f.writelines("%s\n" % l for l in lines) en el segundo fragmento

  3. -4

    De hecho, creo que el problema es que la variable «líneas» es malo. Usted define las líneas como una tupla, pero creo que escribir() requiere de una cadena. Todo lo que tienes que cambiar es tu comas en más (+).

    nl = "\n"
    lines = line1+nl+line2+nl+line3+nl
    textdoc.writelines(lines)

    debería funcionar.

    • Uff. Gracias a dios .join() existe.
  4. -4

    si usted quiere guardar y cargar una lista de intentar Pickle

    Pickle ahorro:

    with open("yourFile","wb")as file:
     pickle.dump(YourList,file)

    y carga:

    with open("yourFile","rb")as file:
     YourList=pickle.load(file)
  5. -4

    Ejercicio 16 de Zed Shaw libro? Puede utilizar caracteres de escape de la siguiente manera:

    paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
    target.write(paragraph1)
    target.close()

Dejar respuesta

Please enter your comment!
Please enter your name here