Как сохранить двойной файл в Python? - PullRequest
3 голосов
/ 26 ноября 2009

Допустим, мне нужно сохранить матрицу (каждая строка соответствует одной строке), которая может быть загружена из Фортрана позже. Какой метод мне выбрать? Является ли преобразование всего в строку единственным подходом?

Ответы [ 4 ]

6 голосов
/ 26 ноября 2009

Вы также можете сохранить их в двоичном формате. Пожалуйста, смотрите документацию на стандартный модуль struct, он имеет функцию pack для преобразования объекта Python в двоичные данные.

Например:

import struct

value = 3.141592654
data = struct.pack('d', value)
open('file.ext', 'wb').write(data)

Вы можете конвертировать каждый элемент вашей матрицы и записывать в файл. Fortran должен быть в состоянии загрузить эти двоичные данные. Вы можете ускорить процесс, преобразовав строку целиком, например:

row_data = struct.pack('d' * len(matrix_row), *matrix_row)

Обратите внимание, что 'd' * len(matrix_row) является константой для вашего размера матрицы, поэтому вам нужно рассчитать эту строку формата только один раз.

2 голосов
/ 26 ноября 2009

Я не знаю фортран, поэтому трудно сказать, что вам легко выполнить на этой стороне для разбора.

Звучит так, будто ваши варианты либо сохраняют двойные числа в виде открытого текста (что означает «преобразование» их в строку), либо в двоичном формате (используя struct и т.п.). Решение, для которого лучше, зависит.

Я бы выбрал решение с открытым текстом, поскольку это означает, что файлы будут легко читаемыми, и вам не придется возиться с различными видами деталей (порядковый номер, двойные размеры по умолчанию).
Но бывают случаи, когда двоичный файл лучше (например, если у вас действительно большой список значений типа double и пробел важен, или если вам легче его проанализировать, и вам нужна оптимизация) - но это, скорее всего, не так ваш случай.

1 голос
/ 26 ноября 2009

Если удобочитаемость и простота доступа важны (и размер файла приемлемый), Fortran может легко проанализировать простой массив чисел, по крайней мере, если он заранее знает размер матрицы (с чем-то вроде READ (FILE_ID, '2). (F) '), я думаю):

1.234  5.6789e4
3.1415 9.265358978
42     ...

Два вложенных цикла for в вашем коде Python могут легко записать вашу матрицу в этой форме.

1 голос
/ 26 ноября 2009

Вы можете использовать JSON

import json
matrix = [[2.3452452435, 3.34134], [4.5, 7.9]]
data = json.dumps(matrix)
open('file.ext', 'wb').write(data)

Содержимое файла будет выглядеть так:

[[2.3452452435, 3.3413400000000002], [4.5, 7.9000000000000004]]
...