Храните много переменных в файле
Я пытаюсь сохранить много переменных в файле. Я пробовал JSON, pickle и shelve, но все они, кажется, принимают только одну переменную
import shelve
myShelve = shelve.open('my.shelve')
myShelve.update(aasd,
basd,
casd,
dasd,
easd,
fasd,
gasd,
hasd,
iasd,
jasd)
myShelve.close()
И мариновать
import pickle
with open("vars.txt", "wb") as File:
pickle.dumps(aasd,
basd,
casd,
dasd,
easd,
fasd,
gasd,
hasd,
iasd,
jasd,
File)
Ошибки, которые я получаю, соответствуют
TypeError: update() takes at most 2 positional arguments (11 given)
а также
TypeError: pickle.dumps() takes at most 2 positional argument (11 given)
Я не уверен, есть ли какой-либо другой способ хранения переменных, кроме использования базы данных, но это немного больше, чем я сейчас могу сказать.
3 ответа
Вы можете выбрать только одну переменную за раз, но это может быть dict
или другой объект Python. Вы можете хранить множество переменных в одном объекте и мариновать этот объект.
import pickle
class Box:
pass
vars = Box()
vars.x = 1
vars.y = 2
vars.z = 3
with open("save_vars.pickle", "wb") as f:
f.write(pickle.dumps(vars))
with open("save_vars.pickle", "rb") as f:
v = pickle.load(f)
assert vars.__dict__ == v.__dict__
РЕДАКТИРОВАТЬ: Я просто подумал о другом способе хранения ваших переменных, но это немного странно, и мне интересно, что гуру думают об этом.
Вы можете сохранить файл, в котором есть код python ваших определений переменных, например vars.py
которая состоит из простых утверждений, определяющих ваши ценности:
x = 30
y = [1,2,3]
Затем, чтобы загрузить это в вашу программу, просто сделайте from vars import *
и у вас будет x
а также y
определяется, как если бы вы их набрали.
Оригинальный нормальный ответ ниже...
Есть способ с помощью JSON вернуть ваши переменные, не переопределяя их имена, но вы должны сначала создать словарь переменных.
import json
vars={} # the dictionary we will save.
LoL = [ range(5), list("ABCDE"), range(5) ]
vars['LOList'] = LoL
vars['x'] = 24
vars['y'] = "abc"
with open('Jfile.txt','w') as myfile:
json.dump(vars,myfile,indent=2)
Теперь, чтобы загрузить их обратно:
with open('Jfile.txt','r') as infile:
D = json.load(infile)
# The "trick" to get the variables in as x,y,etc:
globals().update(D)
Теперь x и y определены из словарных статей:
print x,y
24 abc
Существует также альтернатива, использующая определения переменной за переменной. Таким образом, вам не нужно создавать словарь заранее, но вы должны переименовать переменные в правильном порядке, когда вы загружаете их обратно.
z=26
w="def"
with open('Jfile2.txt','w') as myfile:
json.dump([z,w],myfile,indent=2)
with open('Jfile2.txt','r') as infile:
zz,ww = json.load(infile)
И вывод:
print zz,ww
26 def
С помощью pickle
вы сбрасываете по одному объекту за раз. Каждый раз, когда вы дамп в файл, вы добавляете еще одну "запись".
import pickle
with open("vars.txt", "wb") as File:
for item in (aasd,
basd,
casd,
dasd,
easd,
fasd,
gasd,
hasd,
iasd,
jasd)
pickle.dump(item,File)
Теперь, когда вы хотите вернуть свои данные, вы используете pickle.load
прочитать следующую "запись" из файла:
import pickle
with open('vars.txt') as fin:
aasd = pickle.load(fin)
basd = pickle.load(fin)
...
В качестве альтернативы, в зависимости от типа данных, предполагается, что данные json
может сериализовать, вы можете сохранить его в списке json:
import json
# dump to a string, but you could use json.dump to dump it to a file.
json.dumps([aasd,
basd,
casd,
dasd,
easd,
fasd,
gasd,
hasd,
iasd,
jasd])