Храните много переменных в файле

Я пытаюсь сохранить много переменных в файле. Я пробовал 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])
Другие вопросы по тегам