2

私はこの種のファイル(一部)を持っています:

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 ループ内のループからすべての変数を抽出できますが、これは適切なコーディングとは思えません...

誰か私を右足に乗せてもらえますか? 私はコーディングが好きなので、完全な解決策は望んでいませんが (私の主な仕事は CNC マシンのコーディングです。これは Python に比べて今では簡単に思えます)、どのアプローチが最適かを知りたいです...

4

2 に答える 2

1

データ型を手動で変換する代わりに、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}
于 2015-12-05T08:31:46.197 に答える
1

インスピレーションとして、次のようなことができます。

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
于 2015-12-05T07:52:19.570 に答える