2015-12-05 3 views
2

Je possède ce type de fichier (partie):Converting CNC de vieux forages au nouveau système (en utilisant 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. 

...

que je veux convertir à un nouveau système de programmation. Ce que je veux faire est d'abord lire l'en-tête (H) et mettre les valeurs DX, DY et DZ dans des variables nommées respectivement. J'ai réussi à faire cela, mais quand je suis venu pour traiter ma ligne XBO (un forage, dont j'ai besoin X, Y, Z, V, R, x, y, D, N, F et;, également dans des variables séparées) mon code a commencé à avoir l'air très moche très vite.

Je recommençais, et est venu avec ceci:

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=""  

Cela permet d'identifier correctement les commandes séparées H et XBO, mais je suis un peu coincé maintenant. Je peux utiliser la même méthode pour extraire toutes les variables, des boucles à l'intérieur des boucles H et XBO, mais cela ne semble pas être un bon codage ...

Quelqu'un peut-il me mettre sur le bon pied s'il vous plaît? Je ne veux pas de solution complète, comme j'aime coder (mon travail principal est de coder pour des machines CNC, ce qui semble facile maintenant par rapport à Python), mais j'aimerais savoir quelle approche est la meilleure ...

+0

Utilisez un dictionnaire au lieu de plusieurs variables. – falsetru

+0

Regardez dans 'str.split()', 'dict()', et 'ast.literal_eval()'. – TigerhawkT3

Répondre

0

Au lieu de convertir les types de données à la main, vous pouvez utiliser ast. literal_eval. Cette fonction d'aide prend une liste de la forme ['a=2', 'b="abc"'] et se transforme en un dictionnaire {'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) 

analyse syntaxique Maintenant, le fichier devient un peu plus simple:

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]) 

Résultats:

>>> 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 une source d'inspiration, vous pouvez faire quelque chose comme ceci:

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 "" 

maintenant header contient les extensions de votre domaine:

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

et xbo les autres valeurs:

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

Accédez aux valeurs individuelles dans les dictionnaires:

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

Merci à tous pour les réponses impressionnantes! Peut continuer avec mon projet maintenant :). – stormychel

+0

Vous pouvez [accepter] (http://stackoverflow.com/help/accepted-answer) une réponse si elle résout votre problème. –

+0

Ok faudra regarder comment faire ça en premier :). Votre réponse a résolu le problème et a ouvert beaucoup d'autres possibilités pour le programme auquel je n'avais même pas pensé au début ... – stormychel