2013-12-05 4 views
4

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

данные выглядит примерно так

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 для руки 1, 3-4 для руки 2 и так далее. В первой строке указывается местоположение, а во второй строке указывается набор инструкций (перемещение, изменения направления, повороты и т. Д.)

Что я ищу, это способ импортировать этот текстовый файл, проанализировать его правильно и заполнить словарь, который будет генерировать автоматические ключи. Обратите внимание, что файл содержит только значение. Вот почему мне тяжело. Как сообщить программе генерировать armX (где X - это идентификатор от 1 до n) и назначить ему кортеж (или пару) таким образом, чтобы словарь читал.

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

Прошу прощения, если новичок-ish vocab является излишним или неясным. Пожалуйста, дайте мне знать, и я буду рад прояснить.

Прокомментированный код, который легко понять, поможет мне изучить концепции и мотивацию.

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

+1

Строки '' A''B'2' и 'EWMWEM'? – sPaz

+1

Я предполагал, что ему нужны «AB2» и «EWMWEM». – Boo

+0

@sPaz: спасибо, что спросили. Не имеет значения, является ли «A» «B» «AB». Однако мне нужно, чтобы 2 был int. –

ответ

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 
+0

Выглядит хорошо. Хотя я думал, что номера строк '01>' были там только для вопроса. В любом случае, это должно быть хорошим началом. – sPaz

+1

будьте осторожны, используя слово dict как имя переменной. 'isinstance (dict, dict)' дает ошибку – jpwagner

+0

@jpwagner, это хороший момент, отредактировал ответ. – Boo

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

+0

Можете ли вы объяснить эту часть? 'result = dict (zip (tuple (« arm% s »% i для i в диапазоне (1, len (odd_lines) +1)), tuple (zip (odd_lines, even_lines))))' –

+0

'zip 'принимает два списка/кортежей и создает кортеж с n-м элементом каждого списка/кортежа (т. е.' zip ([1,2,3], [4,5,6]) == [(1,4), (2,5), (3,6)] '' dict' принимает список/кортеж и превращает его в dict с первым элементом в качестве ключа, поэтому 'dict ([(1,4), (2,5) , (3,6)]) == {1: 4,2: 5,3: 6} '... так, как говорится выше, строка zips armX с кортежем (id, cmd) и поворачивается он в dict – jpwagner

+0

, затем попробуйте 'zip (('a', 'b', 'c'), tuple (zip ((1,2,3), (4,5,6)))) == [('a', (1, 4)), ('b', (2, 5)), ('c', (3, 6))] '...и, наконец, 'dict (zip (('a', 'b', 'c'), tuple (zip ((1,2,3), (4,5,6))))) == {'a' : (1, 4), 'b': (2, 5), 'c': (3, 6)} ' – jpwagner

-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 
+0

, если это большой файл, вы не хотите загружать все в памяти, также будьте осторожны, используя 'index + 1' – jpwagner

+0

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

+0

нм, на самом деле я думаю, что это спорный момент, так как мы создаем dict со всем в нем. – jpwagner

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