Как я могу создать словарь в Python из TXT-файла? - PullRequest
2 голосов
/ 16 декабря 2011

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

NODE=SC-1,CPU=90
NODE=SC-1,MEM=10
NODE=SC-1,FS=80
NODE=SC-1,DIORead=30
NODE=SC-1,DIOWrite=40
NODE=SC-1,NTX=30
NODE=SC-1,NRX=40
NODE=SC-2,CPU=80
NODE=SC-2,MEM=10
NODE=SC-2,FS=80
NODE=SC-2,DIORead=30
NODE=SC-2,DIOWrite=40
NODE=SC-2,NTX=30
NODE=SC-2,NRX=40

Как я могу разобрать файл и создать словарь для узла SC-1 и один словарь для узла SC-2, который я могу позже в своей программеОбратитесь, чтобы получить конкретные значения для определенных узлов?

Ответы [ 5 ]

4 голосов
/ 16 декабря 2011
from collections import defaultdict
d = defaultdict(dict)
for line in open('input_file','r'):
    line = line.strip()
    a,b = line.split(',')
    node = a.split('=')[1] 
    key, value = b.split('=')
    d[node][key] = value
0 голосов
/ 16 декабря 2011

Учитывая, что ваша файловая структура соответствует вашему примеру выше, я бы так и сделал -

import pprint

def read_file_into_dict(filename):
    f = open(filename, 'r')

    main_dict = {}

    for line in f:
        line = line.strip()
        node_line, param_line = line.split(',')
        node_name = node_line.split('=')[1]
        param, value = param_line.split('=')

        if main_dict.get(node_name):
            main_dict[node_name][param] = value
        else:
            main_dict[node_name] = {param: value}

    return main_dict

pprint.pprint(read_file_into_dict('sample.txt'))

Вот вывод -

$ python sample.py 
{'SC-1': {'CPU': '90',
          'DIORead': '30',
          'DIOWrite': '40',
          'FS': '80',
          'MEM': '10',
          'NRX': '40',
          'NTX': '30'},
 'SC-2': {'CPU': '80',
          'DIORead': '30',
          'DIOWrite': '40',
          'FS': '80',
          'MEM': '10',
          'NRX': '40',
          'NTX': '30'}}
0 голосов
/ 16 декабря 2011

Вы можете создать «2D» словарь, то есть словарь словарей.

Ключами «внешнего» словаря будут имена узлов (например, «SC-1», «SC-2»), а значением будет другой словарь с ключами {CPU, MEM, FS, DIORead, DIOWrite, NTX, NRX}.

примерно так:

outerDict = {}
for line in open('input', 'rb').readlines():
    key = line.split(',')[0].split('=')[0]
    key2, val = line.split(',')[1].split('=')

    if outerDict.has_key(key):
        outerDict[key][key2] = val
    else:
        outerDict[key] = {}
        outerDict[key][key2] = val
0 голосов
/ 16 декабря 2011

Вот моя попытка (не проверено):

sc1 = {}    
sc2 = {}    
f = open("myfile", "r")
for line in f:  
  dict = None
  for statement in line.split(','):
    varname, value = statement.split('=')
    if varname == 'NODE' and value == 'SC-1':
      dict = sc1
    elif varname == 'NODE' and value == 'SC-2':
      dict = sc2
    else:
      dict[varname] = value
0 голосов
/ 16 декабря 2011

Полагаю, вы хотите проанализировать этот файл и сохранить все SC-* в качестве ключей, а остальные - в качестве их значений. Если ключи являются дубликатами, то объедините значения. Если это то, что вы ищете, то у меня есть рукописный код, который делает именно это -

Я сначала разбил строку на ,, а затем на = и получил ключ, если ключ уже существует, тогда объединение создает новую запись.

def readFileIntoDict(fileHandle, dictName):
     line = fileHandle.readline() 
     dictName = {} 

     while line: 
         key  = line.split(',').split('=')[1]
         if key in dictName:
             dictName[key].append(line)
         else:
             dictName[key] = [line]
         line = fileHandle.readline() 
     return dictName

Поправь меня, если я понял, что ты хочешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...