Лучший способ получить значения переменных от текстового файла?

Относясь по этому вопросу, у меня есть подобное - но не то же - проблема..

На моем пути у меня будет некоторый текстовый файл, структурированный как:

var_a: 'home'
var_b: 'car'
var_c: 15.5

И мне нужен тот Python, читает файл и затем создают переменную, названную var_a со значением 'домой', и так далее.

Пример:

#python stuff over here
getVarFromFile(filename) #this is the function that im looking for
print var_b
#output: car, as string
print var_c
#output 15.5, as number.

Действительно ли это возможно, я имею в виду, даже сохраняю тип var?

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

Править: ConfigParser может быть решением, но мне не нравится он так, потому что в моем сценарии я должен буду затем обратиться к переменным в файле с

config.get("set", "var_name")

Но то, что я буду любить, должно относиться к переменной непосредственно, поскольку я объявил это в сценарии Python...

Существует способ импортировать файл как словарь Python?

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

Редактирование 2: мне очень интересно в решении stephan JSON, потому что таким образом текстовый файл мог быть считан просто с языками других (PHP, затем через Ajax JavaScript, например), но я перестал работать в чем-то при действии того решения:

#for the example, i dont load the file but create a var with the supposed file content
file_content = "'var_a': 4, 'var_b': 'a string'"
mydict = dict(file_content)
#Error: ValueError: dictionary update sequence element #0 has length 1; 2 is required
file_content_2 = "{'var_a': 4, 'var_b': 'a string'}"
mydict_2 = dict(json.dump(file_content_2, True))
#Error:
#Traceback (most recent call last):
#File "", line 1, in 
#mydict_2 = dict(json.dump(file_content_2, True))
#File "C:\Python26\lib\json\__init__.py", line 181, in dump
#fp.write(chunk)
#AttributeError: 'bool' object has no attribute 'write'

В каких проблемах я могу упасть с форматом JSON? И, как я могу считать массив JSON в текстовом файле и преобразовать его в Python dict?

P.S.: Мне не нравится решение с помощью .py файлы; я предпочту, чтобы .txt, .inc, .whatever не был строг на один язык.

38
задан martineau 4 October 2019 в 21:02
поделиться

6 ответов

Load your file with JSON or PyYAML into a dictionary the_dict (see doc for JSON or PyYAML for this step, both can store data type) and add the dictionary to your globals dictionary, e.g. using globals().update(the_dict).

If you want it in a local dictionary instead (e.g. inside a function), you can do it like this:

for (n, v) in the_dict.items():
    exec('%s=%s' % (n, repr(v)))

as long as it is safe to use exec. If not, you can use the dictionary directly.

15
ответ дан 27 November 2019 в 03:01
поделиться

Но что мне нравится, так это ссылаться на переменную direclty, как я объявил в скрипте python.

Предполагая, что вы готовы немного изменить свой синтаксис, просто используйте python и импортируйте Модуль "config".

# myconfig.py:

var_a = 'home'
var_b = 'car'
var_c = 15.5

Затем выполните

from myconfig import *

И вы можете ссылаться на них по имени в вашем текущем контексте.

67
ответ дан 27 November 2019 в 03:01
поделиться

Используйте ConfigParser.

Ваша конфигурация:

[myvars]
var_a: 'home'
var_b: 'car'
var_c: 15.5

Ваш код Python:

import ConfigParser

config = ConfigParser.ConfigParser()
config.read("config.ini")
var_a = config.get("myvars", "var_a")
var_b = config.get("myvars", "var_b")
var_c = config.get("myvars", "var_c")
24
ответ дан 27 November 2019 в 03:01
поделиться

Насколько надежен ваш формат? Если разделителем всегда является «:», работает следующее. Если нет, то подойдет сравнительно простое регулярное выражение.

Пока вы работаете с довольно простыми типами переменных, функция eval в Python удивительно упрощает сохранение переменных в файлах.

(Ниже приведен словарь, btw, которое, как вы упомянули, было одним из ваших предпочтительных решений).

def read_config(filename):
    f = open(filename)
    config_dict = {}
    for lines in f:
        items = lines.split(': ', 1)
        config_dict[items[0]] = eval(items[1])
    return config_dict
3
ответ дан 27 November 2019 в 03:01
поделиться

Вы можете рассматривать ваш текстовый файл как модуль Python и динамически загружать его с помощью imp.load_source :

import imp
imp.load_source( name, pathname[, file]) 

Пример:

// mydata.txt
var1 = 'hi'
var2 = 'how are you?'
var3 = { 1:'elem1', 2:'elem2' }
//...

// In your script file
def getVarFromFile(filename):
    import imp
    f = open(filename)
    global data
    data = imp.load_source('data', '', f)
    f.close()

# path to "config" file
getVarFromFile('c:/mydata.txt')
print data.var1
print data.var2
print data.var3
...
23
ответ дан 27 November 2019 в 03:01
поделиться

What you want appear to want is the following, but this is NOT RECOMMENDED:

>>> for line in open('dangerous.txt'):
...     exec('%s = %s' % tuple(line.split(':', 1)))
... 
>>> var_a
'home'

This creates somewhat similar behavior to PHP's register_globals and hence has the same security issues. Additionally, the use of exec that I showed allows arbitrary code execution. Only use this if you are absolutely sure that the contents of the text file can be trusted under all circumstances.

You should really consider binding the variables not to the local scope, but to an object, and use a library that parses the file contents such that no code is executed. So: go with any of the other solutions provided here.

(Please note: I added this answer not as a solution, but as an explicit non-solution.)

0
ответ дан 27 November 2019 в 03:01
поделиться
Другие вопросы по тегам:

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