2009-04-30 5 views
20

У меня есть список значений с плавающей запятой в Python:Как вывести список поплавков в двоичный файл в Python

floats = [3.14, 2.7, 0.0, -1.0, 1.1] 

Я хотел бы написать эти значения, чтобы двоичный файл, используя IEEE 32- бит. Каков наилучший способ сделать это в Python? В моем списке на самом деле содержится около 200 МБ данных, поэтому лучше всего «не слишком медленно».

Поскольку есть 5 значений, я просто хочу получить 20-байтовый файл.

+0

Ваш массив отсутствует запятая между числами. –

ответ

30

Алекс абсолютно прав, это более эффективно делать это таким образом:

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() 

И затем прочитать массив так:

input_file = open('file', 'r') 
float_array = array('d') 
float_array.fromstring(input_file.read()) 

array.array объекты также имеют .fromfile метод, который может быть использован для считывания ц le, если вы знаете количество предметов заранее (например, из размера файла или какого-либо другого механизма)

+1

Не должен ли первый аргумент в массиве быть «f», поскольку запрашивается 32-битная кодировка? – dmagree

+0

FWIW, оказывается, что ответ struct на самом деле быстрее. Я сделал несколько профилирования нескольких различных альтернатив, а struct - быстрее всего. https://gist.github.com/deanmalmgren/fd1714799dc5b5643b87#file-write_profiler-py – dino

12

См: Python's struct module

import struct 
s = struct.pack('f'*len(floats), *floats) 
f = open('file','wb') 
f.write(s) 
f.close() 
+0

Собственно, это то, что я сейчас делаю. Я просто подумал, что должен быть лучший способ. –

+1

И есть лучший способ - модуль массива. Подробнее см. Http://docs.python.org/library/array.html. –

+0

Вы должны использовать синтаксис 'with'. –

10

Модуль массива в стандартной библиотеке может быть более подходящим для выполнения этой задачи, чем модуль STRUCT который предлагая всем. Производительность с 200 МБ данных должна быть существенно лучше с массивом.

Если вы хотите принять во множестве вариантов, попробуйте профилирование в системе с something like this

8

Я не уверен, как NumPy будет сравнивать производительность для вашего приложения, но, возможно, стоит изучить его.

Использование NumPy:

from numpy import array 
a = array(floats,'float32') 
output_file = open('file', 'wb') 
a.tofile(output_file) 
output_file.close() 

результаты в файл в 20 байт, а также.

+1

не так быстро, как использовать struct. см. профилирование здесь https://gist.github.com/deanmalmgren/fd1714799dc5b5643b87#file-write_profiler-py – dino

1

Я столкнулся с подобной проблемой, нечаянно записывая CSV-файл на 100+ ГБ. Ответы здесь были очень полезны, но, чтобы добраться до него, I profiled all of the solutions mentioned and then some. Все профайлинговые прогоны были выполнены на Macbook Pro 2014 с SSD с использованием python 2.7. Из того, что я вижу, то struct подход, безусловно, самый быстрый с точки зрения производительности:

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 
Смежные вопросы