我有一些试图解析信息的CNC代码。这些块是相当重复的,因此我认为将它们加载到字典中是有意义的,并通过该块中的关键字进行解析。作为示例,如下所示:
%
O4001(AARD0509280 REV-C 1-11-13)
(SAVE 4001-S206)
(BODY.187 EDUCTOR-SPEC)
(UPDATED 02-09-16)
M91
M94002
N1(SET UP)G0G18G40G97G99T0
M60
M11
G4U.2
G300X[[#2708+#2008]-.06]Z1.T0800
G150Z.438
M10
G4U.2
G0Z-.05
G28U0
M1
N2(FACE)
T2121
M3S3000P1
M8
G99G0X.25Z0
G1X-.02F.001
Z-.02F.01
G0Z-.05T0
G28U0
M1
基本上,我想做的是每次想将Nx
或Nxx
命中时添加到字典中的新键上。每个块始终以Nxx
开始,并以M1
结尾。
我尝试过的是这种变化:
# iterate thru files
for path, subdirs, files in os.walk(root + '\\'):
for file in files:
src = os.path.join(path, file)
o = open(src, 'r') # , encoding='Latin-1'
idx_name = 'Heading'
for line in o.readlines():
if line[0] == 'N':
N = line.split('(')
N = N[0]
idx_name = N
program_dict[idx_name] = line
break
break
print(program_dict)
在我看来,每行都应追加到字典的最新idx_name
(键)后面,只有重命名才会弹出一个新的Nxx
。这是输出的内容:
{
"Heading": " \n",
"N1": " \n",
"N2": " \n",
"N3": " \n",
"N4": " \n",
"N5": " \n",
"N6": " \n",
"N7": " \n",
"N8 ": " \n",
"N9": " \n",
"N10 ": " \n",
"N11": " \n",
"N12": " \n",
"N13": " \n",
"N14 ": " \n",
"N15 ": " \n",
"N16": " \n",
"N17": " \n",
"N18": " \n",
"N19": "%"
}
很显然,我在进行故障排除时很忙,所以应该没有那么多,但这是我期望字典使用的格式:
heading: %, O4001(AARD0509280 REV-C 1-11-13), (SAVE 4001-S206), (BODY.187 EDUCTOR-SPEC), (UPDATED 02-09-16), M91, M94002
N1: N1(SET UP)G0G18G40G97G99T0, G4U.2, G300X[[#2708+#2008]-.06]Z1.T0800, G150Z.438, M10, G4U.2,G0Z-.05, G28U0, M1
N2: N2(FACE), T2121, M3S3000P1, M8, G99G0X.25Z0, G1X-.02F.001, Z-.02F.01, G0Z-.05T0, G28U0, M1
我要去哪里错了?
答案 0 :(得分:0)
您的问题似乎是,program_dict[idx_name] = line
始终用ìdx_name
的键替换line
的值,因此该条目将始终只包含下一行之前的最后一行Nxx
。要附加line
,请使用+=
。但是,如果该条目尚不存在,则会引发异常,这就是为什么您必须检查以下内容的原因:
if idx_name in program_dict:
program_dict[idx_name] += line
else:
program_dict[idx_name] = line
不幸的是,在简要查看字典类型的文档后,我还没有找到更优雅的解决方案。或者,您也可以在开始循环之前通过插入
来创建条目program_dict[idx_name] = str()
之后,您可以安全地附加到它。
这应该可以解决您的问题。