Es esta la forma más limpia para escribir una lista a un archivo, ya que writelines() no insertar caracteres de salto de línea?

file.writelines(["%s\n" % item  for item in list])

Parece que sería una forma estándar…

  • tenga en cuenta que writelines no agregar saltos de línea, porque los espejos readlines, que también no los quita.
  • sí, pero ¿por qué no readlines quitar saltos de línea?
  • python tiene sin duda un camino con hacer lo que uno menos espera/preferir

17 Comentarios

  1. 730

    Se puede utilizar un bucle:

    with open('your_file.txt', 'w') as f:
        for item in my_list:
            f.write("%s\n" % item)

    En Python 2, también puede utilizar

    with open('your_file.txt', 'w') as f:
        for item in my_list:
            print >> f, item

    Si usted está interesado en una sola llamada a la función, al menos quitar los corchetes [], por lo que las cadenas de caracteres para ser impresa en la que se hacen de una en una (un genexp en lugar de un listcomp) … no hay razón para ocupar toda la memoria necesaria para materializar la totalidad de la lista de cadenas.

    • Esto no es terriblemente complejo, pero, ¿por qué no usar simplemente el pepinillo o json para que usted no tiene que preocuparse acerca de la serialización y deserialización?
    • Por ejemplo, porque desea que un archivo de texto de salida que se puede leer fácilmente, editar, etc, con un elemento por línea. Apenas un raro deseo;-).
    • He encontrado que el \n en el primero de ellos era redundante en Python 2.7/Windows
    • Este va a escribir un extra carácter de nueva línea al final… en lugar de bucle, puede escribir thefile.write('\n'.join(thelist))
    • Yo añadiría: «cuidado con la lista tipo de datos». Yo era conseguir unos resultados extraños, tal vez esto puede ayudar a alguien: thefile.write(str(item) + "\n")
    • El siguiente: TestFile = open("Test.txt","w+") TestFile.write("This is a test!!!!!") TestFile.close sólo me da un archivo de texto vacío Test.txt ¿Qué estoy haciendo mal?

  2. 315

    ¿Qué vas a hacer con el archivo? ¿Este archivo existe para los seres humanos, o de otros programas con clara de los requisitos de interoperabilidad?

    Si usted está tratando de serializar una lista en el disco para su uso posterior por el mismo pitón de la aplicación, usted debe ser pickleing la lista.

    import pickle
    
    with open('outfile', 'wb') as fp:
        pickle.dump(itemlist, fp)

    A leer de nuevo:

    with open ('outfile', 'rb') as fp:
        itemlist = pickle.load(fp)
    • +1 – ¿por Qué reinventar la rueda cuando Python tiene la serialización incorporada?
    • +1 – outfile es algo así como: open( "save.p", "wb" ) de este argumento es algo así como: open( "save.p", "rb" )
    • El problema es que la lista debe caber en la memoria. Si este no es el caso, línea por línea es de hecho una estrategia posible (o lo que está pasando con algunas alternativas como en stackoverflow.com/questions/7180212/…)
    • En Python 2 uso de la ‘r’ en lugar de ‘rb’ cuando la lectura de la salmuera si usted consigue el «ValueError: inseguro de la cadena de pepinillo»
  3. 231

    La mejor manera es:

    outfile.write("\n".join(itemlist))
    • Sin ella la siguiente línea, utiliza el espacio 2x en comparación con el bucle.
    • Por supuesto, la primera pregunta que viene a la mente es si o no el OP necesita para terminar en una nueva línea y si es o no la cantidad de la materia. Sabes lo que dicen sobre la optimizaciones.
    • Una desventaja: Este construye la totalidad de los contenidos del archivo en la memoria antes de escribir cualquiera de ellas, por lo que el pico de uso de memoria puede ser alta.
    • Nota de la documentación del sistema operativo del módulo: no utilice el sistema operativo.linesep como un terminador de línea al escribir los archivos abiertos en modo texto (el valor predeterminado); el uso de un único ‘\n’, en cambio, en todas las plataformas.
    • Nunca puedo conseguir que esto funcione. Me sale este error: «texto = ‘\n’.join(namelist) + ‘\n’ TypeError: secuencia del elemento 0: cadena esperada, lista encontrado»
    • Usted tiene que asegurarse de que todos los elementos de ‘namelist’ son cadenas.
    • Si desea agregar un punto newline aquí, simplemente agregue un + "\n" al final. No veo qué problema @Dave tiene con esta.
    • Para la larga lista, este método es mucho más rápido.
    • ¿Cómo conseguir que el outfile variable?
    • Hola Jonathan, puedes hacer outfile = open("output.txt", "w") # 'w' open file for writing and truncate it content o with open("output.txt", "w") as outfile: # use outfile here.

  4. 86

    De otra manera. Serializar a json utilizando simplejson (incluido como json en python 2.6):

    >>> import simplejson
    >>> f = open('output.txt', 'w')
    >>> simplejson.dump([1,2,3,4], f)
    >>> f.close()

    Si usted examina output.txt:

    [1, 2, 3, 4]

    Esto es útil porque la sintaxis de python, es legible por los humanos, y puede ser leído por otros programas en otros idiomas.

    • la mejor solución para legible de salida.
    • simplejson.de carga(f) para leer lo que ha escrito.
    • también funciona bien para las listas anidadas 🙂
    • La teoría de que JSON es legible por los humanos es dudosa 😉
  5. 83

    Utilizando Python 3 y Python 2.6+ sintaxis:

    with open(filepath, 'w') as file_handler:
        for item in the_list:
            file_handler.write("{}\n".format(item))

    Esto es independiente de la plataforma. Termina también el final de la línea con un carácter de nueva línea, que es un UNIX mejores prácticas.

    • no quiero añadir «\n» para el último elemento, ¿qué hacer? no quiero que si la condición
    • Reemplace el bucle for con file_handler.write("\n".join(str(item) for item in the_list))
  6. 36

    Pensé que sería interesante explorar los beneficios de la utilización de un genexp, así que aquí está mi toma.

    El ejemplo en la cuestión utiliza corchetes para crear un temporal de lista, y así es equivalente a:

    file.writelines( list( "%s\n" % item for item in list ) )

    Que innecesariamente construcciones temporales lista de todas las líneas que se escriben, esto puede consumir grandes cantidades de memoria en función del tamaño de la lista y cómo detallado de la salida de str(item) es.

    Caída de los corchetes (equivalente a la eliminación de la envoltura list() la llamada anterior) en lugar de pasar un temporal generador de a file.writelines():

    file.writelines( "%s\n" % item for item in list )

    Este generador creará nueva línea terminada en representación de su item objetos en la demanda (es decir, como se escribe). Esto es bueno para un par de razones:

    • La memoria de los gastos generales son pequeñas, incluso para grandes listas de
    • Si str(item) es lento hay avances visibles en el archivo, ya que cada elemento se procesa

    Esto evita problemas de memoria, tales como:

    In [1]: import os
    
    In [2]: f = file(os.devnull, "w")
    
    In [3]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
    1 loops, best of 3: 385 ms per loop
    
    In [4]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
    ERROR: Internal Python error in the inspect module.
    Below is the traceback from this internal error.
    
    Traceback (most recent call last):
    ...
    MemoryError

    (Me provocó este error mediante la limitación de Python max. la memoria virtual a ~100MB con ulimit -v 102400).

    Poner el uso de memoria a un lado, este método no es en realidad más rápido que el original:

    In [4]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
    1 loops, best of 3: 370 ms per loop
    
    In [5]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
    1 loops, best of 3: 360 ms per loop

    (Python 2.6.2 en Linux)

    • +1 – realmente el mejor enfoque en el caso de archivos de gran tamaño.
  7. 19

    Serializar lista en un archivo de texto con coma sepparated valor

    mylist = dir()
    with open('filename.txt','w') as f:
        f.write( ','.join( mylist ) )
  8. 17

    Porque soy un vago….

    import json
    a = [1,2,3]
    with open('test.txt', 'w') as f:
        f.write(json.dumps(a))
    
    #Now read the file back into a Python list object
    with open('test.txt', 'r') as f:
        a = json.loads(f.read())
    • son listas de json serializable?
    • Sí, de hecho, lo es!
    • importación json ; test_list = [1,2,3]; list_as_a_string = json.vertederos(test_list); #list_as_a_string ahora es la cadena ‘[1,2,3]’
    • Estoy haciendo esto with open ('Sp1.txt', 'a') as outfile: json.dump (sp1_segments, outfile) logger.info ("Saved sp_1 segments") ; el problema es que mi programa se ejecuta tres veces, y los resultados de tres carreras están recibiendo puré de arriba. hay alguna forma de añadir 1-2 líneas vacías, de modo que los resultados de cada carrera son perceptibles?
    • Absolutamente! podría, en lugar de hacer json.dump(sp1_segments + "\n\n", outfile)?
  9. 14

    En General

    Siguiente es la sintaxis para writelines() método

    fileObject.writelines( sequence )

    Ejemplo

    #!/usr/bin/python
    
    # Open a file
    fo = open("foo.txt", "rw+")
    seq = ["This is 6th line\n", "This is 7th line"]
    
    # Write sequence of lines at the end of the file.
    line = fo.writelines( seq )
    
    # Close opend file
    fo.close()

    Referencia

    http://www.tutorialspoint.com/python/file_writelines.htm

  10. 12
    file.write('\n'.join(list))
    • Uno debe tener en cuenta que esto requiere que el archivo se abre como texto para ser verdaderamente plataforma neutral.
    • ¿Cómo conseguir que el file variable?
  11. 7

    También puede utilizar la función de impresión si estás en python3 de la siguiente manera.

    f = open("myfile.txt","wb")
    print(mylist, file=f)
    • no es sólo poner una línea en myfile.txt, algo así como: [‘a’,’b’,’c’] en lugar de escribir cada una,b,c en cada línea.
  12. 2

    Esta lógica convertir primero los elementos de la lista a string(str). A veces, la lista contiene una tupla como

    alist = [(i12,tiger), 
    (113,lion)]

    Esta lógica de escritura para el archivo de cada tupla en una nueva línea. Podemos usar más tarde eval mientras que la carga de cada tupla al leer el archivo:

    outfile = open('outfile.txt', 'w') # open a file in write mode
    for item in list_to_persistence:    # iterate over the list items
       outfile.write(str(item) + '\n') # write to the file
    outfile.close()   # close the file 
    • Por favor, añadir un poco de explicación.
    • se añadió una explicación! @petezurich
  13. 1

    Otra forma de la iteración y la adición de nueva línea:

    for item in items:
        filewriter.write(f"{item}" + "\n")
  14. -2

    Vamos a avg ser la lista, entonces:

    In [29]: a = n.array((avg))
    In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')

    Puede utilizar %e o %s dependiendo de su requisito.

  15. -2
    poem = '''\
    Programming is fun
    When the work is done
    if you wanna make your work also fun:
    use Python!
    '''
    f = open('poem.txt', 'w') # open for 'w'riting
    f.write(poem) # write text to file
    f.close() # close the file

    Cómo Funciona:
    En primer lugar, abrir un archivo utilizando el construido en función open y especificando el nombre de
    el archivo y el modo en el que queremos abrir el archivo. El modo puede ser un
    el modo de lectura («r»), el modo de escritura («w») o en modo append (‘a’). También podemos especificar
    si estamos leyendo, escribiendo, o anexar en el modo de texto (‘t’) o binario
    modo (‘b’). En realidad, hay muchos más modos disponibles y ayuda(abierto)
    te dará más detalles acerca de ellos. Por defecto, abrir() consideran que el archivo
    ser una ‘t’ext archivo y lo abre en ‘r’ead modo.
    En nuestro ejemplo, primero se abre el archivo en el modo de escritura de texto y el uso de la escritura
    método del objeto archivo para escribir en el archivo y, a continuación, finalmente se nos cierre el archivo.

    El ejemplo de arriba es del libro «Un Byte de Python» por Swaroop C H.
    swaroopch.com

    • Este escribe una cadena en un archivo, no una lista (de cadenas) como el OP pregunta

Dejar respuesta

Please enter your comment!
Please enter your name here