Как вывести список с плавающей точкой в ​​двоичный файл в Python - PullRequest
24 голосов
/ 30 апреля 2009

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

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

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

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

Ответы [ 7 ]

38 голосов
/ 30 апреля 2009

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

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', 'rb')
float_array = array('d')
float_array.fromstring(input_file.read())

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

16 голосов
/ 30 апреля 2009

См .: Структурный модуль Python

import struct
s = struct.pack('f'*len(floats), *floats)
f = open('file','wb')
f.write(s)
f.close()
11 голосов
/ 30 апреля 2009

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

Если вы хотите использовать различные варианты, попробуйте профилировать в вашей системе с помощью что-то вроде этого

9 голосов
/ 01 мая 2009

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

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

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

также приводит к 20-байтовому файлу.

3 голосов
/ 30 апреля 2009

struct.pack () выглядит так, как вам нужно.

http://docs.python.org/library/struct.html

3 голосов
/ 30 апреля 2009

взгляните на struct.pack_into

2 голосов
/ 08 декабря 2015

Я столкнулся с подобной проблемой при непреднамеренной записи CSV-файла размером более 100 ГБ. Ответы здесь были чрезвычайно полезны, но, чтобы разобраться в этом, я профилировал все упомянутые решения, а затем некоторые . Все прогоны профилирования выполнялись на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...