2015-06-30 3 views
1

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

var = "123abc" 

будут импортированы, и переменная, и это содержимое импортируется в код, что позволяет мне читать, что содержащаяся переменная вар. Это отлично работает с использованием этого кода:

def get_save(filename): 
result = {} 
with open(filename) as f: 
    for line in f: 
     try: 
      line = line.split(' = ',1) 
      result[line[0]] = ast.literal_eval(line[1].strip()) 
     except: 
      pass 
return result 

globals().update(get_save('SAVEFILE.TXT')) 

Однако я хочу сделать что-то более сложное. Я хотел бы иметь возможность создавать объекты в этом текстовом файле. Вот пример класса:

class object(): 
    def __intit__(self, var, var2): 
     self.var = var 
     self.var2 = var2 

Я тогда хотел бы быть в состоянии сделать это в моем текстовом файле:

ob = object("abc", 123) 

или:

obs = [object("def", 456), object("ghi", 789)] 

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

EDIT: Я хотел бы текстовый файл, чтобы быть легко доступны для редактирования и читаемым

Благодаря

ответ

2

Я считаю, что то, что вы ищете является pickle или json библиотеки.
Оба варианта позволяют сохранять целые объекты python в файл и загружать из него одни и те же объекты.
Простой пример использования:

import pickle 

target_object = {some_value:3, other_value:4} 
target_file = open("1.txt", "w") 
pickle.dump(target_object, target_file) 

А потом загрузка:

fl = open("1.txt", "r") 
obj = pickle.load(fl) 

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

Однако маринованные файлы труднодоступны для редактирования. Ive обнаружил, что использование json для файлов настроек намного удобнее, поскольку их можно легко редактировать простым текстовым редактором. Это работает практически так же:

json.dump() сбрасывает в файл, json.load загрузок из файла.

BUT Json не может легко кодировать любой объект. В основном это полезно для хранения dicts.
Если вам нужен более сложный объект и сохранить удобочитаемость файла, вы можете реализовать методы serialize и deserialize на своих объектах, в основном позволяя их переносить в и из dict. Вот пример (несовершенный):

class SomeObject(object): 
    def __init__(self, x, y, data=None): 
     if data: 
      self.deserialize(data) 
     else: 
      self.x = x 
      self.y = y 
    def serialize(self): 
     return dict(x=self.x, y=self.y) 
    def deserialize(self, data): 
     self.x = data['x'] 
     self.y = data['y'] 
+0

Когда я пытаюсь использовать JSON, я получаю эту ошибку: TypeError: не является JSON serializable – Inazuma

+0

Да, я не упомянул об этом, но json может только сериализовать базовые типы, такие как список, dict, Boolean, numbers и т. Д. сериализация объекта немного сложнее, но можно найти решение [здесь] (http://stackoverflow.com/questions/3768895/python-how-to-make-a-class-json-serializable). Все зависит от того, какую сложность вы хотите. Если это только файлы настроек, файлы Id рекомендуют сохранять их как dict. –

0

Вы можете использовать pickle для хранения полномасштабных объектов в файл.

import pickle 

class Holiday(): 
    def __init__(self): 
     self.holiday = True 
     self.away = '' 

    def set_away(self, holiday): 
     if holiday: 
      self.away = "Two weeks" 

    def say_away(self): 
     print(self.away) 

obj = Holiday() 
obj.set_away(1) 

pickle.dump(obj, open('holiday.save', 'wb')) 

recovered_obj = pickle.load(open('holiday.save', 'rb')) 

recovered_obj.say_away()