Сохранение кода в python

easy save/load of data in python

What is the easiest way to save and load data in python, preferably in a human-readable output format? The data I am saving/loading consists of two vectors of floats. Ideally, these vectors would be named in the file (e.g. X and Y). My current save() and load() functions use file.readline() , file.write() and string-to-float conversion. There must be something better.

7 Answers 7

The most simple way to get a human-readable output is by using a serialisation format such a JSON. Python contains a json library you can use to serialise data to and from a string. Like pickle, you can use this with an IO object to write it to a file.

import json file = open('/usr/data/application/json-dump.json', 'w+') data = < "x": 12153535.232321, "y": 35234531.232322 >json.dump(data, file) 

If you want to get a simple string back instead of dumping it to a file, you can use json.dumps() instead:

import json print json.dumps(< "x": 12153535.232321, "y": 35234531.232322 >) 

Reading back from a file is just as easy:

import json file = open('/usr/data/application/json-dump.json', 'r') print json.load(file) 

The json library is full-featured, so I’d recommend checking out the documentation to see what sorts of things you can do with it.

There are several options — I don’t exactly know what you like. If the two vectors have the same length, you could use numpy.savetxt() to save your vectors, say x and y , as columns:

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

If you are dealing with larger vectors of floats, you should probably use NumPy anyway.

@nos: It takes a file name or a file object. Might be that old versions of NumPy only accepted a string. I pass a file object to be able to write the header line before.

You can add the header line directly in numpy.savetxt thanks to an optional argument, as in numpy.savetxt(«data», numpy.array([x, y]).T, header=»x y») (the comment symbol and newline are automatically added to the header line). Thanks to that, you don’t need to do any extra file handling any more and it’s all in one line.

@Dalker Yep, these days the code can be simplified, but savetxt() didn’t have this option at the time.

  • If it should be human-readable, I’d also go with JSON. Unless you need to exchange it with enterprise-type people, they like XML better. 🙂
  • If it should be human editable and isn’t too complex, I’d probably go with some sort of INI-like format, like for example configparser.
  • If it is complex, and doesn’t need to be exchanged, I’d go with just pickling the data, unless it’s very complex, in which case I’d use ZODB.
  • If it’s a LOT of data, and needs to be exchanged, I’d use SQL.

That pretty much covers it, I think.

CSV is a good format if your data is very simple (ie tabular), and you want to be able to import it in a spreadsheet. Otherwise it’s too undefined, not easily readable or editable, can’t handle complex data, and is a pain if the dataset is big.

A simple serialization format that is easy for both humans to computers read is JSON.

You can use the json Python module.

Here is an example of Encoder until you probably want to write for Body class:

# add this to your code class BodyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.ndarray): return obj.tolist() if hasattr(obj, '__jsonencode__'): return obj.__jsonencode__() if isinstance(obj, set): return list(obj) return obj.__dict__ # Here you construct your way to dump your data for each instance # you need to customize this function def deserialize(data): bodies = [Body(d["name"],d["mass"],np.array(d["p"]),np.array(d["v"])) for d in data["bodies"]] axis_range = data["axis_range"] timescale = data["timescale"] return bodies, axis_range, timescale # Here you construct your way to load your data for each instance # you need to customize this function def serialize(data): file = open(FILE_NAME, 'w+') json.dump(data, file, cls=BodyEncoder, indent=4) print("Dumping Parameters of the Latest Run") print(json.dumps(data, cls=BodyEncoder, indent=4)) 

Here is an example of the class I want to serialize:

class Body(object): # you do not need to change your class structure def __init__(self, name, mass, p, v=(0.0, 0.0, 0.0)): # init variables like normal self.name = name self.mass = mass self.p = p self.v = v self.f = np.array([0.0, 0.0, 0.0]) def attraction(self, other): # not important functions that I wrote. 
# you need to customize this function def serialize_everything(): bodies, axis_range, timescale = generate_data_to_serialize() data = BodyEncoder.serialize(data) 
def dump_everything(): data = json.loads(open(FILE_NAME, "r").read()) return BodyEncoder.deserialize(data) 

Источник

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Как сохранить программу из консоли?

#1 Ноя. 3, 2022 08:05:57

Как сохранить программу из консоли?

Наверное, вопрос сугубо дилетантский, но уж простите новичку!
Пользовался IDLE для написания программ. С помощью форумчан научился запускать ранее написанные программы в консоли Python. С действиями в интерактивном режиме тоже понятно. Но как выйти из интерактивного режима, написать программу и сохранить?
У Лутца прочитал, что для написания длинной программы следует после ввода строк кода дважды нажимать
“ENTER”. Но у меня не получается, выскакивает дважды >>>. Пытался в консоли Python, в консоли Windows и в Windows Power Shell.

Отредактировано Simka (Ноя. 3, 2022 08:59:11)

#2 Ноя. 3, 2022 10:48:37

Как сохранить программу из консоли?

Отредактировано m1r42 (Ноя. 3, 2022 10:49:30)

#3 Ноя. 3, 2022 14:09:50

Как сохранить программу из консоли?

Я не могу сказать про IDLE, что не нравится. Нравится, удобно. Но… Когда начал знакомство с Питоном, возникали вопросы по IDLE. И вот что мне написали в ответ:
«IDLE не нужно использовать. Надо открыть питон в консоли — запустить cmd.exe и там
запустить python.exe . ..

Главная задача для тебя сейчас — исключить IDLE полностью из работы с питоном».

Теперь, освоившись с азами Питона, в том числе — с IDLE, вспомнил про эту рекомендацию одного из авторитетных форумчан с высокой репутацией.
Кстати, на Ютубе масса уроков по Python, и практически везде консоль. Правда, с ответом на мой вопрос не нахожу.

Отредактировано Simka (Ноя. 3, 2022 14:10:18)

#4 Ноя. 3, 2022 14:36:57

Как сохранить программу из консоли?

Ну если совсем так кардинально подойти, то создавайте файл в блокноте или хотя бы в Notepad++ и сохраняйте на диске с расширением .py, а потом запускайте его в консоли cmd. Я так делаю на старом ноутбуке на даче где кроме windows xp и python27 ничего больше не работает. Интересное рукоблудство от нечего делать. В windows 7 есть PowerShell более продвинутая cmd. Писать же прямо в консоли Python запущенном через cmd да еще все это и в файл сохранять — это конечно верх безумства. В конце концов надо же когда — то еще и программу писать и тестировать.
Я так делаю:

Отредактировано m1r42 (Ноя. 3, 2022 14:41:05)

#5 Ноя. 3, 2022 15:03:27

Как сохранить программу из консоли?

Но можно и так. Открываем консоль cmd запускаем python создаем новый текстовый файл через блокнот, сохраняем с расширением .py и творим магию python в консоли:

>>> f = open("c:/test_rukobludstva.py",'w')
>>> f.write("строка программы 1")
>>> f.write("\n")
>>> f.write("строка программы 2")
>>> f.close()

#6 Ноя. 3, 2022 15:19:42

Как сохранить программу из консоли?

Simka
Теперь, освоившись с азами Питона, в том числе — с IDLE, вспомнил про эту рекомендацию одного из авторитетных форумчан с высокой репутацией.

И еще совет как новичка, но уже не совсем новичка. Прислушиваться к советам авторитетов, но делать так как удобно самому. Мне, например, советуют здесь отказаться от использования Классов, но это не значит что я так сделаю, наоборот я их буду использовать как можно чаще, на вред. И задавать еще больше вопросов в которых хочу разобраться. Исключить IDLE можно при помощи блокнота. Другой вопрос надо ли исключать IDLE совсем? Чем в изучении будет мешать автоматический отступ или предложение IDLE выбрать нужный аргумент класса например, или подсветка текста разными цветами. Да ни чем это не мешает. Наоборот для глаз приятней, зрение знаете ли надо тоже беречь.

#7 Ноя. 3, 2022 15:37:33

Как сохранить программу из консоли?

1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите и вставьте ссылку на его url

есчщо

#8 Ноя. 3, 2022 15:40:47

Как сохранить программу из консоли?

что касается ide (ну или типа того) то pycharm, visual studio code, wing … много

1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Ноя. 3, 2022 15:41:42)

#9 Ноя. 3, 2022 15:55:45

Как сохранить программу из консоли?

Так то IPython — это уже наворот. Задача же колоть дрова ножовкой .

#10 Ноя. 3, 2022 16:09:59

Как сохранить программу из консоли?

… ну тогда вопрос а че за кансоль? шелл то понятно cmd
или что по хардкору cmd.exe … ну нафиг это фу

1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Ноя. 3, 2022 16:13:13)

Источник

Модуль pickle

Python 3 логотип

Модуль pickle реализует мощный алгоритм сериализации и десериализации объектов Python. «Pickling» — процесс преобразования объекта Python в поток байтов, а «unpickling» — обратная операция, в результате которой поток байтов преобразуется обратно в Python-объект. Так как поток байтов легко можно записать в файл, модуль pickle широко применяется для сохранения и загрузки сложных объектов в Python.

Не загружайте с помощью модуля pickle файлы из ненадёжных источников. Это может привести к необратимым последствиям.

Модуль pickle предоставляет следующие функции для удобства сохранения/загрузки объектов:

pickle.dump(obj, file, protocol=None, *, fix_imports=True) — записывает сериализованный объект в файл. Дополнительный аргумент protocol указывает используемый протокол. По умолчанию равен 3 и именно он рекомендован для использования в Python 3 (несмотря на то, что в Python 3.4 добавили протокол версии 4 с некоторыми оптимизациями). В любом случае, записывать и загружать надо с одним и тем же протоколом.

pickle.dumps(obj, protocol=None, *, fix_imports=True) — возвращает сериализованный объект. Впоследствии вы его можете использовать как угодно.

pickle.load(file, *, fix_imports=True, encoding=»ASCII», errors=»strict») — загружает объект из файла.

pickle.loads(bytes_object, *, fix_imports=True, encoding=»ASCII», errors=»strict») — загружает объект из потока байт.

Модуль pickle также определяет несколько исключений:

Оцените статью