python - 从文件导入数据并自动填充字典

时间:2013-12-05 19:40:39

标签: python parsing file-io dictionary

我是一个蟒蛇新手,我正在努力完成以下任务。 一个文本文件包含一些有点奇怪的格式的数据,我想知道是否有一种简单的方法来解析它并使用正确的键和值自动填充一个空字典。

数据看起来像这样

01> A B 2          ##01> denotes the line number, that's all
02> EWMWEM         
03> C D 3
04> EWWMWWST
05> Q R 4
06> WESTMMMWW

因此,每对线描述了机器人手臂的全套指令。对于线1-2,对于arm1,3-4对于arm 2,依此类推。第一行表示位置,第二行表示指令集(移动,方向变化,转弯等)。

我正在寻找的是一种导入此文本文件,正确解析并填充将生成自动密钥的字典的方法。请注意,该文件仅包含值。这就是我遇到困难的原因。如何告诉程序生成armX(其中X是从1到n的ID)并为其分配一个元组(或一对),使字典读取。

dict = {'arm1': ('A''B'2, EWMWEM) ...}

如果新手的词汇多余或不清楚,我很抱歉。请让我知道,我很乐意澄清。

易于理解的注释代码将帮助我学习概念和动机。

只是提供一些背景信息。程序的要点是加载所有指令,然后在臂上执行方法。因此,如果您认为有更优雅的方式可以在不加载所有说明的情况下进行,请建议。

3 个答案:

答案 0 :(得分:0)

我会做那样的事情:

mydict = {} # empty dict
buffer = ''
for line in open('myFile'): # open the file, read line by line
    linelist = line.strip().replace(' ', '').split('>') # line 1 would become ['01', 'AB2']
    if len(linelist) > 1: # eliminates empty lines
        number = int(linelist[0])
        if number % 2: # location line
            buffer = linelist[1] # we keep this till we know the instruction
        else:
            mydict['arm%i' % number/2] = (buffer, linelist[1]) # we know the instructions, we write all to the dict

答案 1 :(得分:0)

def get_instructions_dict(instructions_file):
    even_lines = []
    odd_lines = []
    with open(instructions_file) as f:
        i = 1
        for line in f:
            # split the lines into id and command lines
            if i % 2==0:
                # command line
                even_lines.append(line.strip())
            else:
                # id line
                odd_lines.append(line.strip())
            i += 1

    # create tuples of (id, cmd) and zip them with armX ( armX, (id, command) )
    # and combine them into a dict
    result = dict( zip ( tuple("arm%s" % i for i in range(1,len(odd_lines)+1)),
                      tuple(zip(odd_lines,even_lines)) ) )

    return result

>>> print get_instructions_dict('instructions.txt')
{'arm3': ('Q R 4', 'WESTMMMWW'), 'arm1': ('A B 2', 'EWMWEM'), 'arm2': ('C D 3', 'EWWMWWST')}

注意dict键未订购。如果重要,请使用OrderedDict

答案 2 :(得分:-1)

robot_dict = {}
arm_number = 1
key = None
for line in open('sample.txt'):
   line = line.strip().replace("\n",'')
   if not key:
       location = line
       key = 'arm' + str(arm_number) #setting key for dict
   else:
       instruction = line
       robot_dict[key] = (location,line)
       key = None #reset key
       arm_number = arm_number + 1