txt - Escribir una lista en un archivo con Python
escribir una lista en un archivo python (17)
En general
A continuación se muestra la sintaxis del método writelines ().
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
¿Es esta la forma más limpia de escribir una lista en un archivo, ya que writelines()
no inserta caracteres de nueva línea?
file.writelines(["%s/n" % item for item in list])
Parece que habría una manera estándar ...
¿Qué vas a hacer con el archivo? ¿Existe este archivo para personas u otros programas con requisitos claros de interoperabilidad, o simplemente está intentando serializar una lista a disco para su uso posterior por la misma aplicación de Python? Si el segundo caso es este, deberías estar pickleing la lista.
import pickle
with open(''outfile'', ''wb'') as fp:
pickle.dump(itemlist, fp)
Para leerlo de nuevo:
with open (''outfile'', ''rb'') as fp:
itemlist = pickle.load(fp)
Deje que avg sea la lista, entonces:
In [29]: a = n.array((avg))
In [31]: a.tofile(''avgpoints.dat'',sep=''/n'',dtype = ''%f'')
Puede usar %e
o %s
dependiendo de su requerimiento.
Esta lógica primero convertirá los elementos de la lista en string(str)
. A veces la lista contiene una tupla como
alist = [(i12,tiger),
(113,lion)]
Esta lógica escribirá para archivar cada tupla en una nueva línea. Luego podemos usar eval
mientras cargamos 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
La mejor manera es:
outfile.write("/n".join(itemlist))
Otra forma de iterar y agregar nueva línea:
for item in items:
filewriter.write(f"{item}" + "/n")
Otra forma más. Serialize to json usando 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 examinas output.txt:
[1, 2, 3, 4]
Esto es útil porque la sintaxis es pythonic, es legible por humanos y puede ser leída por otros programas en otros idiomas.
Pensé que sería interesante explorar los beneficios de usar un genexp, así que aquí está mi opinión.
El ejemplo de la pregunta utiliza corchetes para crear una lista temporal, por lo que es equivalente a:
file.writelines( list( "%s/n" % item for item in list ) )
Lo que construye innecesariamente una lista temporal de todas las líneas que se escribirán, esto puede consumir una cantidad significativa de memoria dependiendo del tamaño de su lista y de cuán detallada es la salida de str(item)
.
Elimine los corchetes (lo que equivale a eliminar la llamada de la list()
envoltura anterior) pasará un generator temporal a file.writelines()
:
file.writelines( "%s/n" % item for item in list )
Este generador creará una representación de nueva línea de sus objetos de item
a pedido (es decir, a medida que se escriben). Esto es bueno por un par de razones:
- Los gastos generales de memoria son pequeños, incluso para listas muy grandes
- Si
str(item)
es lento, hay un progreso visible en el archivo a medida que se procesa cada elemento
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
(Desencadené este error al limitar la memoria virtual máxima de Python a ~ 100MB con ulimit -v 102400
).
Dejando de lado el uso de la memoria, 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)
Porque no lo intentas
file.write(str(list))
Porque soy perezoso ....
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())
Puedes usar 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 puedes usar
with open(''your_file.txt'', ''w'') as f:
for item in my_list:
print >> thefile, item
Si está interesado en una llamada a una sola función, al menos elimine los corchetes []
, de modo que las cadenas que se van a imprimir se formen una a la vez (un genexp en lugar de una lista comp), no hay razón para ocupar todas las Memoria requerida para materializar toda la lista de cadenas.
Serializar la lista en un archivo de texto con un valor separado por comas
mylist = dir()
with open(''filename.txt'',''w'') as f:
f.write( '',''.join( mylist ) )
También puede usar la función de impresión si está en python3 de la siguiente manera.
f = open("myfile.txt","wb")
print(mylist, file=f)
Usando 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. También termina la línea final con un carácter de nueva línea, que es la mejor práctica de UNIX .
file.write(''/n''.join(list))
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: Primero, abra un archivo usando la función de apertura incorporada y especificando el nombre del archivo y el modo en que queremos abrir el archivo. El modo puede ser un modo de lectura (''r''), modo de escritura (''w'') o modo agregado (''a''). También podemos especificar si estamos leyendo, escribiendo o agregando en modo texto (''t'') o modo binario (''b''). En realidad, hay muchos más modos disponibles y la ayuda (abierta) le dará más detalles sobre ellos. Por defecto, open () considera que el archivo es un archivo ''t'' y lo abre en modo ''r''. En nuestro ejemplo, primero abrimos el archivo en modo de texto de escritura y usamos el método de escritura del objeto de archivo para escribir en el archivo y luego cerramos el archivo por fin.
El ejemplo anterior es del libro "A Byte of Python" de Swaroop C H. swaroopch.com
with open ("test.txt","w")as fp:
for line in list12:
fp.write(line+"/n")