простое сохранение/загрузка данных в 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 десятичными знаками).