2016-08-25 2 views
0

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

CalculationVals=[{'startx':0,'starty':0,'endx':10, 'endy':10}, {'startx':1,'starty':1,'endx':12, 'endy':12}] 

, а затем в основной части программы отдельные CalculationVals зацикливаются. Есть ли способ прочитать это с помощью argparse или лучший способ предоставить этот ввод с использованием метода argparse? Преимущество здесь не в использовании дополнительных пакетов.

+5

Почему? Это не то, на что указывает argparse, –

+0

Ваше описание неполное. Является ли текущий файл 'py', который вы« импортируете »(буквально). Почему вы хотите изменить использование 'argparse' для чтения файла; он не читает файлы, хотя его можно использовать для определения имени файла. Он анализирует командную строку, а не файлы. – hpaulj

ответ

1

Это не то, что argparse для. Он предназначен для анализа аргументов командной строки, а не файлов конфигурации.

Похоже, что ваш конфиг в JSON, и если вы не делаете что-то чрезвычайно странное и сильно злоупотребляете библиотекой, argparse не знает, как разбирать JSON. Итак, чтобы понять параметры, которые вам нужно будет import json в любом случае. В этот момент самый простой (и наиболее эффективным), что нужно сделать бы

import json 

with open('/your/config/file', 'r') as f: 
    config = json.loads(f.read()) 
+0

«Делайте что-то чрезвычайно странное и сильно злоупотребляйте библиотекой» - я не могу сопротивляться. Вы можете просто указать 'type = json.loads' или' type = ast.literal_eval' в вашем вызове 'add_argument'.Удачи, ускользая отформатированных данных через оболочку, хотя, если вы когда-либо использовали этот параметр в командной строке. Вы будете тратить много времени на косое слежение за косой чертой ... –

+0

@SteveJessop вы можете, конечно, сделать что-то подобное. Но для этого вам все равно нужно будет импортировать библиотеку 'json', которая, как мне кажется, следует избегать. Если вы не напишете собственный парсер JSON, которого нельзя избежать –

+1

Я не знаю, считаются ли 'ast' и' json' «дополнительными пакетами» или нет, они являются стандартными модулями Python. Вы можете использовать 'eval', который является встроенной функцией. Очевидно, что это ужасная идея, но это потому, что «избегать использования стандартных модулей любой ценой» - это страшная идея начать с :-) –

0

Как Дмитрий Рекомендуемая, передавая JSON в качестве аргумента функции не является рекомендуемым способом.

Итак, я предлагаю вам передать путь json file в аргументе вместо всего json-файла.

# test_prog.py 
import argparse 
import json 

parser = argparse.ArgumentParser() 
parser.add_argument("-f","--filepath", help="json file path") 
args = parser.parse_args() 

with open(args.filepath, 'r') as f: 
     config = json.load(f) 

print config 

Затем используйте это значение для чтения с использованием json lib.

В случае, если json-файл также удален, вы можете передать URL-адрес в качестве параметра!

Пример запуска:

$ python test_prog.py -f ./f1.json 
[{u'endy': 10, u'endx': 10, u'startx': 0, u'starty': 0}, {u'endy': 12, u'endx': 12, u'startx': 1, u'starty': 1}] 

Содержимое файла, f1.json:

[{"startx":0,"starty":0,"endx":10, "endy":10},{"startx":1,"starty":1,"endx":12, "endy":12}] 
0

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

./your_script.py startx=0, starty=0, endx=10, endy=10 

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

JSON файла:

{ 
    "CalculationVals": [{ 
     "startx": 0, 
     "starty": 0, 
     "endx": 10, 
     "endy": 10 
    }, { 
     "startx": 1, 
     "starty": 1, 
     "endx": 12, 
     "endy": 12 
    }] 
} 

Python:

import argparse 
import json 

parser = argparse.ArgumentParser() 
parser.add_argument('file') 
args = parser.parse_args() 

with open(args.file) as fi: 
     configs = json.load(fi) 
     for values in configs['CalculationVals']: 
       startx = values['startx'] 
       starty = values['starty'] 

Вызов сценария: ./your_script.py config.json

Смежные вопросы