2016-03-21 3 views
0

Привет Я использую python 3 на Mac, и я пытаюсь создать общую программу для связи с различными мультиметрами, зависящими от того, какой текстовый файл загружен. Например, я хочу словарь, который будет выглядеть примерно так:Как я могу скрыть содержимое текстового файла в словаре

prog_key = {"DC_Volts":"FUNC:DC V","AC_Volts":"FUNC:AC V"...} #just an example 

Это в конечном итоге будет использоваться в сочетании с библиотекой pyvisa для того, чтобы посылать команды на метр.

Таким образом, для того, чтобы моя программа родовой, я хочу этот словарь:

prog_key = {} 

загрузить текстовый файл, который имеет следующее содержание:

"DC_Volt”:”FUNC:VOLT DC”, 
"DC_Curr”:”FUNC:CURR DC”, 
"AC_Volt”:”FUNC:VOLT AC”, 
"AC_Curr”:”FUNC:CURR AC”, 
"Res_2”:”FUNC:RES”, 
"Res_4”:”FUNC:RES 4”, 
"Freq”:”FUNC:FREQ”, 
"Cap”:”FUNC:CAP”, 
"Temp”:”FUNC:TEMP”, 
"Diode”:”FUNC:DIO”, 
“Meas”:”MEAS:IMM” 

Как я приготовь -форматированный в текстовом файле, я буквально просто хочу сбросить его в словаре (все кавычки, двоеточия и запятые будут на месте). Я делаю это так, так как разные счетчики будут иметь разные команды, поэтому я могу просто загрузить другой текстовый файл, если я использую другой счетчик.

Является ли тот факт, что мои команды имеют двоеточие, вызовут какие-либо проблемы?

Если это лучший способ, я не против переформатировать текстовый файл. Главное, что я делаю все свои текстовые файлы в соответствии с той же тенденцией, не имеет значения, что этот трент до тех пор, пока он работает!

Благодаря

Edit: те, которые на самом деле имел в виду, чтобы быть прямо цитирует

+1

Являются ли эти на самом деле умные кавычки ('«и '» ') там, или они действительно прямые кавычки (' "')? – ShadowRanger

+0

Это больше походит на прецеденте для классов, чем для словаря. В основном класс - это расширенный словарь. Вы даже можете использовать наследование для работы с метрами, которые имеют некоторые сходства. –

+0

Я отредактировал его, они должны быть прямыми цитатами –

ответ

1

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

"DC_Volt","FUNC:VOLT DC" 
"DC_Curr","FUNC:CURR DC" 
"AC_Volt","FUNC:VOLT AC" 

Это позволит вам читать в вашем словаре следующим образом:

import csv 

my_dict = {} 

with open('myfile.csv', 'r') as f: 
    for line in csv.reader(f): 
    my_dict[line[0]] = line[1] 

EDIT: Как @ShadowRanger предположил, что это может быть лучше, чем JSON CSV. (Это позволит вам сохранить ваш ключ-значение формата).

файл может выглядеть следующим образом:

{ 
    "DC_Volt":"FUNC:VOLT DC", 
    "DC_Curr":"FUNC:CURR DC", 
    "AC_Volt":"FUNC:VOLT AC" 
} 

и вы код может быть:

import json 

with open('myfile.json', 'r') as f: 
    j = json.load(f) 
+0

На самом деле было бы еще проще, если бы это была ровно одна пара в строке: 'my_dict = dict (csv.reader (f))' будет делать это. Нет необходимости инициализировать пустую 'dict', без явного цикла в Python. – ShadowRanger

+0

А, симпатичный маленький вкладыш! что один. – user3194712

+0

Как только я разместил это, я подумал об использовании csv вместо –

1

Ну, не изменяя существующий файл, так как ключи и значения являются все юридические str литералы (при условии, эти умные котировки были ошибкой), вы могли бы просто позволить Python выполнять работу с использованием ast.literal_eval или json.loads:

import ast 
import json 

with open(myfilename) as f: 
    dict_literal_str = '{{ {} }}'.format(f.read()) 
# With ast 
prog_key = ast.literal_eval(dict_literal_str) 
# or json 
prog_key = json.loads(dict_literal_str) 
+0

Почему двойные фигурные скобки? –

+0

@PeterWood: метод 'format' в противном случае интерпретировал бы их как разделители элементов формата; вы избегаете скобок, удваивая их. – ShadowRanger

+0

А, я помню сейчас, спасибо. –

-1

Это предполагает, что все кавычки в файле являются фактическими ", а не те другие типы котировок. То, что это делает, - это прочитать файл, сопоставить с ним выражение регулярного выражения и заполнить словарь.

import re 

dictionary = {} 
file = open(FILE_NAME, "r") 
for line in file: 
    catched = re.findall("\"(.*)\":\"(.*)\"", line) 
    # Only one result which is a tuple 
    dictionary[catched[0][0]] = catched[0][1] 
file.close() 
+0

Повторяя основной синтаксический анализ с помощью регулярных выражений? Пожалуйста, нет. (Также всегда используйте выражения 'with' для файловых объектов) – ShadowRanger

+0

@ShadowRanger Я один из тех людей, которым нравится изобретать колесо, а не использовать текущий дизайн колеса. Кроме того, я думаю, что это может даже добавить что-то к знаниям людям. Ваш код маленький и простой, но мне не ясно, что он на самом деле делает. В конце концов, я новичок: P – engineercoding

+0

Я все для _learning_, изобретая колеса, но достижение регулярных выражений на самом деле не улучшает ситуацию здесь. В частности, когда дело доходит до разбора известных форматов, всегда используйте соответствующий парсер, когда он доступен; крайние случаи для синтаксического анализа уродливы и часто невозможны или ужасно уродливы для правильной обработки регулярными выражениями (которые либо не являются контекстно-свободной грамматикой, либо плохо выражают контекстно-свободные грамматики). Если это вообще возможно, всегда сначала используйте существующий синтаксический анализатор и прибегайте к регулярным выражениям, если их не существует, и формат достаточно прост, чтобы избежать серьезных случаев краев. – ShadowRanger

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