【问题标题】:How can I create a dictionary in python from a txt file?如何从 txt 文件在 python 中创建字典?
【发布时间】:2011-12-16 13:46:31
【问题描述】:

我有一个如下所示的文件:

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 创建一个字典,以便稍后在我的程序中引用以获取特定节点的特定值?

【问题讨论】:

  • 文件结构固定了吗?我的意思是,文件中的行结构是否总是NODE=<nodename>,<param>=<value>
  • 首先,包含您尝试过的东西的 sn-ps 总是一个好主意。第二:你能给我们提供一个字典应该是什么样子的样本吗?
  • @Powertieke 我希望得到这样的东西: print sc-1.items() ## [('CPU', '90'), ('MEM', '10') , ('FS', '80')] print sc-2.items() ## [('CPU', '80'), ('MEM', '10'), ('FS', '80' )] 为了方便起见,我提交了其余的密钥。谢谢

标签: python parsing dictionary


【解决方案1】:
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

【讨论】:

  • defaultdict 是这里的明显赢家,+1!这些值似乎都是整数 - 如果 OP 同意,那么您也可以在这里进行字符串到整数的转换。或者只是在 try 块中执行 d[node][key] = int(value),如果出现异常,只需将值存储为字符串。
  • 谢谢 Paul,但我们是否为每个节点创建单独的字典?
  • @dan 在这段代码中,是的,但它们在d 内部,由它们的节点名称键入。
  • 我还不知道defaultdict,太棒了。谢谢你。
  • @DanD 非常感谢!现在,如果上面的代码用于构建字典,如何访问特定节点的键?
【解决方案2】:

我相信你想解析这个文件并将所有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

如果我已经解释了你想要的,请纠正我。

【讨论】:

  • 如果你发现自己在写“if key in dictvar, add key to current node, else initialize new node”,这是一个好兆头,默认dict会清理一切。
【解决方案3】:

这是我的尝试(未经测试):

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

【讨论】:

    【解决方案4】:

    考虑到您的文件结构与上面的示例一致,这就是我要做的 -

    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'}}
    

    【讨论】:

      【解决方案5】:

      您可以创建“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
      

      【讨论】:

      • "has_key" 是旧式 Python,现在已弃用,取而代之的是 "if key in dict"。不幸的是,仍然有教程可以教它。
      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多