txt - Cómo mostrar la lista de flotantes en un archivo binario en Python
leer una linea especifica de un archivo en python (7)
Tengo una lista de valores de coma flotante en Python:
floats = [3.14, 2.7, 0.0, -1.0, 1.1]
Me gustaría escribir estos valores en un archivo binario utilizando la codificación IEEE de 32 bits. ¿Cuál es la mejor manera de hacer esto en Python? Mi lista en realidad contiene alrededor de 200 MB de datos, por lo que algo "no demasiado lento" sería lo mejor.
Como hay 5 valores, solo quiero un archivo de 20 bytes como salida.
Alex tiene toda la razón, es más eficiente hacerlo de esta manera:
from array import array
output_file = open(''file'', ''wb'')
float_array = array(''d'', [3.14, 2.7, 0.0, -1.0, 1.1])
float_array.tofile(output_file)
output_file.close()
Y luego lee la matriz así:
input_file = open(''file'', ''r'')
float_array = array(''d'')
float_array.fromstring(input_file.read())
array.array
objetos array.array
también tienen un método .fromfile
que se puede usar para leer el archivo, si conoce el recuento de elementos por adelantado (por ejemplo, desde el tamaño del archivo o algún otro mecanismo)
El módulo de matriz en la biblioteca estándar puede ser más adecuado para esta tarea que el módulo de estructura que todo el mundo está sugiriendo. El rendimiento con 200 MB de datos debería ser sustancialmente mejor con la matriz.
Si desea tomar una variedad de opciones, intente hacer un perfil en su sistema con gist.github.com/deanmalmgren/…
Me encontré con un problema similar al escribir inadvertidamente un archivo csv de más de 100 GB. Las respuestas aquí fueron extremadamente útiles pero, para llegar al fondo del mismo, gist.github.com/deanmalmgren/… . Todas las ejecuciones de creación de perfiles se realizaron en un Macbook Pro 2014 con un SSD utilizando Python 2.7. Por lo que estoy viendo, el enfoque struct
es definitivamente el más rápido desde el punto de vista del rendimiento:
6.465 seconds print_approach print list of floats
4.621 seconds csv_approach write csv file
4.819 seconds csvgz_approach compress csv output using gzip
0.374 seconds array_approach array.array.tofile
0.238 seconds numpy_approach numpy.array.tofile
0.178 seconds struct_approach struct.pack method
Ver: módulo de estructura de Python
import struct
s = struct.pack(''f''*len(floats), *floats)
f = open(''file'',''wb'')
f.write(s)
f.close()
echa un vistazo a struct.pack_into
struct.pack () se parece a lo que necesitas.