2015-12-05 5 views
2

У меня есть такой файл (часть):Преобразование с ЧПУ Сверление от старой к новой системе (с использованием Python)

H DX=615 DY=425 DZ=22.15 -AB C=0 T=0 R=999 *MM /"def" BX=2.5 BY=452.5 BZ=25 ;M20150710. 

XBO X=100 Y=50 Z=5 V=1000 R=0 x=0 y=0 D=10 N="P" F=1 ;Test F1/10P. 

...

, который я хочу, чтобы преобразовать в новую систему программирования. Я хочу сначала прочитать заголовок (H) и поместить значения DX, DY и DZ в соответственно названные переменные. Мне удалось это сделать, но когда я приступил к обработке моей линии XBO (бурение, из которого мне нужны X, Y, Z, V, R, x, y, D, N, F и;, также в отдельных переменных) мой код начал выглядеть очень уродливым очень быстро.

Так что я начал снова, и пришел с этим:

f = open("input.xxl") # open input file 
for line in f: 
    if Debug==1: print line 
    for char in line: 
     charbuffr=charbuffr+char 
     if "H" in charbuffr: 
      if Debug==1: print'HEADER found!' 
      charbuffr=""   
     if "XBO" in charbuffr: 
      if Debug==1: print'XBO found!' 
      charbuffr=""  

Это правильно идентифицирует отдельные команды H и XBO, но я вроде застрял в настоящее время. Я могу использовать тот же метод для извлечения всех переменных из петель внутри петель H и XBO, но это не похоже на хорошее кодирование ...

Может ли кто-нибудь установить меня на правую ногу, пожалуйста? Я не хочу полного решения, так как мне нравится кодирование (ну, моя основная задача - кодирование для машин с ЧПУ, которое теперь кажется простым по сравнению с Python), но хотелось бы знать, какой подход лучше всего ...

+0

Используйте словарь вместо нескольких переменных. – falsetru

+0

Посмотрите на 'str.split()', 'dict()' и 'ast.literal_eval()'. – TigerhawkT3

ответ

0

Вместо преобразования типов данных вручную, вы можете использовать ast. literal_eval. Эта вспомогательная функция принимает список в виде ['a=2', 'b="abc"'] и превращается в словарь {'a': 2, 'b': 'abc'}:

import ast 

def dict_from_row(row): 
    """Convert a list of strings in the form 'name=value' into a dict.""" 
    res = [] 
    for entry in row: 
     name, value = entry.split('=') 
     res.append('"{name}": {value}'.format(name=name, value=value)) 
    dict_string = '{{{}}}'.format(', '.join(res)) 
    return ast.literal_eval(dict_string) 

Теперь разбор файла становится немного проще:

for line in f: 
    row = line.split() 
    if not row: 
     continue 
    if row[0] == 'H': 
     header = dict_from_row(row[1:4]) 
    elif line[0] == 'XBO': 
     xbo = dict_from_row(row[1:11]) 

Результаты:

>>> header 
{'DX': 615, 'DY': 425, 'DZ': 22.15} 

>>> xbo 
{'D': 10, 'F': 1, 'R': 0, 'V': 1000, 'X': 100, 'Y': 50, 'Z': 5, 'x': 0, 'y': 0} 
0

As вдохновение, вы можете сделать что-то вроде этого:

for raw_line in f: 
    line = raw_line.split() 
    if not line: 
     continue 
    if line[0] == 'H': 
     header = {} 
     for entry in line[1:4]: 
      name, value = entry.split('=') 
      header[name] = float(value) 
    elif line[0] == 'XBO': 
     xbo = {} 
     for entry in line[1:11]: 
      name, value = entry.split('=') 
      try: 
       xbo[name] = int(value) 
      except ValueError: 
       xbo[name] = value[1:-1] # stripping of the "" 

header Теперь содержит расширения домена:

{'DX': 615.0, 'DY': 425.0, 'DZ': 22.15} 

и xbo другие значения:

{'D': 10, 
'F': 1, 
'N': 'P', 
'R': 0, 
'V': 1000, 
'X': 100, 
'Y': 50, 
'Z': 5, 
'x': 0, 
'y': 0} 

доступа отдельных значений в словарях:

>>> header['DX'] 
615.0 
+0

Спасибо всем за потрясающие ответы! Можете продолжить мой проект сейчас :). – stormychel

+0

Вы можете [принять] (http://stackoverflow.com/help/accepted-answer) ответ, если он решает вашу проблему. –

+0

Ок, надо будет посмотреть, как это сделать в первую очередь :). Ваш ответ DID разрешил проблему и открыл много других возможностей для программы, о которой я даже не думал сначала ... – stormychel