Записать переменную в файл, включая имя

До сих пор я хотел сохранить эти разделенные запятыми списки в своем SQL-db - хорошо осведомленный обо всех предупреждениях!

Я все думал о том, что у них есть преимущества по сравнению с поисковыми таблицами (которые обеспечивают способ нормализации база данных). После нескольких дней отказа я увидел свет:

  • Использование поисковых таблиц НЕ вызывает больше кода, чем эти уродливые строковые операции при использовании значений, разделенных запятыми, в одном поле.
  • Таблица поиска позволяет создавать собственные числовые форматы и, следовательно, НЕ больше, чем эти поля csv. Хотя это SMALLER.
  • Привязанные строковые операции тонкие в языке высокого уровня (SQL и PHP), но дорогостоящие по сравнению с использованием массивов целых чисел.
  • Базы данных не предназначены для быть правдоподобным, и в основном глупо пытаться придерживаться структур из-за их удобочитаемости / прямой редактируемости, как и я.

Короче говоря, есть причина, по которой нет родной SPLIT () в MySQL.

23
задан unwind 14 December 2009 в 13:41
поделиться

7 ответов

функция repr будет возвращать строку, которая является точным определением вашего dict (за исключением порядка элемента, эти дикты неупорядочены в python). к сожалению, я не могу сказать, как автоматически получить строку, которая представляет имя переменной.

>>> dict = {'one': 1, 'two': 2}
>>> repr(dict)
"{'two': 2, 'one': 1}"

запись в файл - довольно стандартная вещь, как и любая другая запись в файл:

f = open( 'file.py', 'w' )
f.write( 'dict = ' + repr(dict) + '\n' )
f.close()
55
ответ дан Adrien Plisson 14 December 2009 в 13:41
поделиться

используйте pickle

import pickle
dict = {'one': 1, 'two': 2}
file = open('dump.txt', 'w')
pickle.dump(dict, file)
file.close()

и прочитайте его снова

file = open('dump.txt', 'r')
dict = pickle.load(file)

РЕДАКТИРОВАТЬ: Думаю, я неправильно понял ваш вопрос, извините ... но рассол может помочь все равно. :)

22
ответ дан Johannes Charra 14 December 2009 в 13:41
поделиться

Вы можете сделать:

import inspect

mydict = {'one': 1, 'two': 2}

source = inspect.getsourcelines(inspect.getmodule(inspect.stack()[0][0]))[0]
print [x for x in source if x.startswith("mydict = ")]

Также: убедитесь, что не скрываете встроенный диктет!

4
ответ дан ChristopheD 14 December 2009 в 13:41
поделиться

Строковое представление по умолчанию для словаря кажется правильным:

>>> a={3: 'foo', 17: 'bar' }
>>> a
{17: 'bar', 3: 'foo'}
>>> print a
{17: 'bar', 3: 'foo'}
>>> print "a=", a
a= {17: 'bar', 3: 'foo'}

Не уверен, что вы можете получить «имя переменной», так как переменные в Python являются просто метками для значений. См. этот вопрос .

0
ответ дан Community 14 December 2009 в 13:41
поделиться

Это то, что вы ищете?

def write_vars_to_file(_f, **vars):
    for (name, val) in vars.items():
        _f.write("%s = %s\n" % (name, repr(val)))

Использование:

>>> import sys
>>> write_vars_to_file(sys.stdout, dict={'one': 1, 'two': 2})
dict = {'two': 2, 'one': 1}
18
ответ дан Mike D. 14 December 2009 в 13:41
поделиться

Вы просто хотите узнать, как записать строку в файл ? Сначала вам нужно открыть файл:

f = open("filename.txt", 'w')

Затем вам нужно записать строку в файл:

f.write("dict = {'one': 1, 'two': 2}" + '\n')

Вы можете повторить это для каждой строки (+'\n' добавляет новую строку, если вы этого хотите).

Наконец, вам нужно закрыть файл:

f.close()

Вы также можете быть немного умнее и использовать with :

with open("filename.txt", 'w') as f:
   f.write("dict = {'one': 1, 'two': 2}" + '\n')
   ### repeat for all desired lines

Это автоматически закроет файл, даже если возникнут исключения.

Но я подозреваю, что это не то, о чем вы спрашиваете ...

1
ответ дан Andrew Jaffe 14 December 2009 в 13:41
поделиться

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

Вот код:

your_dict = {'one': 1, 'two': 2}

variables = [var for var in dir() if var[0:2] != "__" and var[-1:-2] != "__"]

file = open("your_file","w")
for var in variables:
     if isinstance(locals()[var], dict):
          file.write(str(var) + " = " + str(locals()[var]) + "\n")
file.close()

Единственная проблема здесь в том, что он выведет каждый словарь в вашем пространстве имен в файл, может быть, вы можете отсортировать их по значениям? locals()[var] == your_dict для справки.

Вы также можете удалить if isinstance(locals()[var], dict):, чтобы вывести КАЖДУЮ переменную в вашем пространстве имен, независимо от типа. Ваш вывод выглядит точно так же, как ваше объявление your_dict = {'one': 1, 'two': 2}.

Надеюсь, это сделает тебя еще на шаг ближе! Я внесу изменения, если смогу выяснить, как читать их обратно в пространство имен:)

--- EDIT ---

Понял! Я добавил несколько переменных (и типов переменных) для доказательства концепции. Вот как выглядит мой «testfile.txt»:

string_test = Hello World
integer_test = 42
your_dict = {'one': 1, 'two': 2}

А вот код, который обрабатывает его:

import ast

file = open("testfile.txt", "r")
data = file.readlines()
file.close()

for line in data:
    var_name, var_val = line.split(" = ")
    for possible_num_types in range(3):  # Range is the == number of types we will try casting to
        try:
            var_val = int(var_val)
            break
        except (TypeError, ValueError):
            try:
                var_val = ast.literal_eval(var_val)
                break
            except (TypeError, ValueError, SyntaxError):
                var_val = str(var_val).replace("\n","")
                break
    locals()[var_name] = var_val


print("string_test =", string_test, " :  Type =", type(string_test))
print("integer_test =", integer_test, " :  Type =", type(integer_test))
print("your_dict =", your_dict, " :  Type =", type(your_dict))

Вот что выводит:

string_test = Hello World  :  Type = <class 'str'>
integer_test = 42  :  Type = <class 'int'>
your_dict = {'two': 2, 'one': 1}  :  Type = <class 'dict'>

Мне действительно не нравится, как работает приведение здесь, блок try-кроме громоздок и уродлив. Еще хуже, вы не можете принять просто любой тип! Вы должны знать, что вы ожидаете получить. Это было бы не так плохо, если бы вы заботились только о словарях, но я действительно хотел что-то более универсальное.

Если кто-нибудь знает, как лучше разыграть эти входные переменные, я бы ЛЮБИЛ услышать об этом!

Несмотря на это, это все равно поможет вам: D Я надеюсь, что я помог!

2
ответ дан Conrad Selig 14 December 2009 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: