простое сохранение/загрузка данных в Python
каков самый простой способ сохранения и загрузки данных в python, предпочтительно в удобочитаемом формате вывода?
данные, которые я сохраняю / загружаю, состоят из двух векторов поплавков. В идеале эти векторы будут названы в файле (например, X и Y).
мой save()
и load()
функции file.readline()
, file.write()
и преобразование строки в поплавок. Должно быть что-то получше.
6 ответов
есть несколько вариантов-я не знаю, что вам нравится. Если два вектора имеют одинаковую длину, вы можете использовать numpy.savetxt()
чтобы сохранить векторы, скажите x
и y
, в качестве столбцов:
# saving:
f = open("data", "w")
f.write("# x y\n") # column names
numpy.savetxt(f, numpy.array([x, y]).T)
# loading:
x, y = numpy.loadtxt("data", unpack=True)
если вы имеете дело с большими векторами поплавков, вы, вероятно, должны использовать NumPy в любом случае.
самый простой способ получить читаемый человеком вывод - использовать формат сериализации, такой как JSON. В Python содержит в JSON библиотека, которую можно использовать для сериализации данных в строку и из строки. Как огурец, вы можете использовать это с объектом IO, чтобы записать его в файл.
import json
file = open('/usr/data/application/json-dump.json', 'w+')
data = { "x": 12153535.232321, "y": 35234531.232322 }
json.dump(data, file)
Если вы хотите получить простую строку обратно, а не сбрасывать ее в файл, вы можете использовать в формате JSON.dumps () вместо этого:
import json
print json.dumps({ "x": 12153535.232321, "y": 35234531.232322 })
считывание из файла так же просто:
import json
file = open('/usr/data/application/json-dump.json', 'r')
print json.load(file)
библиотека json является полнофункциональной, поэтому я бы рекомендовал проверка документов чтобы посмотреть, какие вещи вы можете с ним сделать.
Если это должно быть читаемым человеком, я бы также идите с JSON. Если вам нужно обмен с корпоративного типа люди, им больше нравится XML. :-)
Если это должен быть человек редактировать и это не слишком сложно, я бы, наверное, пошел с каким-то INI-подобным форматом, например, configparser.
Если это сложно, и не нужно обменяться, я бы пошел с просто маринование данных, если это не очень сложный, в этом случае я бы использовал ZODB.
Если это много данных, и необходимо обменяйтесь, я бы использовал SQL.
это все объясняет, Я думаю.
простой формат сериализации, который легко читается обоими людьми на компьютерах, - это JSON.
можно использовать в формате JSON модуль Python.
поскольку мы говорим о человеке, редактирующем файл, я предполагаю, что мы говорим об относительно небольших данных.
Как насчет следующей реализации скелет. Он просто сохраняет данные как key=value
пары и работает со списками, кортежами и многими другими вещами.
def save(fname, **kwargs):
f = open(fname, "wt")
for k, v in kwargs.items():
print >>f, "%s=%s" % (k, repr(v))
f.close()
def load(fname):
ret = {}
for line in open(fname, "rt"):
k, v = line.strip().split("=", 1)
ret[k] = eval(v)
return ret
x = [1, 2, 3]
y = [2.0, 1e15, -10.3]
save("data.txt", x=x, y=y)
d = load("data.txt")
print d["x"]
print d["y"]
как я прокомментировал в принятом ответе, используя numpy
Это можно сделать с помощью простого однострочного:
если у вас есть numpy
импортировать как np
(что является обычной практикой),
np.savetxt('xy.txt', np.array([x, y]).T, fmt="%.3f", header="x y")
сохранит данные в (необязательном) формате и
x, y = np.loadtxt('xy.txt', unpack=True)
загрузит его.
файл будет выглядеть так:
# x y
1.000 1.000
1.500 2.250
2.000 4.000
2.500 6.250
3.000 9.000
обратите внимание, что формат строки fmt=...
необязательно, но если цель человека-читабельность может оказаться весьма полезным. Если используется, он указывается с помощью обычного printf
-подобные коды (в моем примере: число с плавающей запятой с 3 десятичными знаками).