我在使用python编写的脚本时遇到了一些困难。我希望有人能够帮助我。我希望我的程序读取一组字符之间的行,颠倒行的顺序,然后将它们写入一个新文件。在下面的文字中跟随的数字" G01X"上升和下降。它们的范围在0.001到149.999之间。它们由字符串" G01Y"分隔。当" G01Y"出现,他们的排序顺序是倒置的。我想创建一个脚本,使这些值始终下降。
它真的是反转每个其他组A-B,C-D的排序顺序的问题。
每次出现时,G01Y的值都会增加0.25。也许这将是识别群体的最佳方式。我采取了一种相当笨拙的方法,试图找出其他所有人的方法。使用[::2]
出现G01Y - 我确定这不是最好的事情。
到目前为止我的代码:
with open('Source.nc') as infile, open('Output.nc', 'w') as outfile:
do_reverse = False
lines_to_reverse = []
strings_A = ("G01Y")
strings_B = ("G01Y"[::2])
for line in infile:
if (x in line for x in strings_A):
do_reverse = False
outfile.writelines(reversed(lines_to_reverse))
outfile.writelines(line)
continue
if do_reverse:
lines_to_reverse.append(line)
continue
else:
outfile.writelines(line)
if (x in line for x in strings_B):
do_reverse = True
lines_to_reverse = []
源代码:
N10 G17 G21 G90
N20 '2014_12_08_Banding_Test_4_250um_Stepover
N30 M3 S1
N40G00X0.000Y0.000Z17.000
N50 G00X0.001Y0.001Z17.000
N60 G01Z0.000F3900.0
N70 G01X0.251
N80 G01X149.999
N90 G01Y0.251
N100 G01X149.749
N110 G01X149.499Z-8.169
N120 G01X148.249Z-8.173
N130 G01X146.999Z-8.183
N140 G01X145.499Z-8.201
N150 G01X143.999Z-8.226
...
N3130 G01X0.001
N3140 G01Y0.501
N3150 G01X0.251
N3160 G01X0.501Z-15.867
N3170 G01X0.751Z-15.795
N3180 G01X1.251Z-15.639
N3190 G01X1.751Z-15.471
N3200 G01X2.251Z-15.290
...
N6190 G01X149.999
N6200 G01Y0.751
N6210 G01X149.749
N6220 G01X149.499Z-8.166
N6230 G01X147.999Z-8.169
N6240 G01X146.499Z-8.179
N6250 G01X144.749Z-8.201
N6260 G01X143.249Z-8.226
...
N9260 G01X0.001
N9270 G01Y1.001
N9280 G01X0.251
N9290 G01X0.501Z-15.865
N9300 G01X0.751Z-15.792
N9310 G01X1.251Z-15.635
N9320 G01X1.751Z-15.463
N9330 G01X2.251Z-15.280
...
N12320 G01X149.999
N12330 G01Y1.251
N12340 G01X149.749
N12350 G01X149.499Z-8.164
N12360 G01X147.999Z-8.163
N12370 G01X146.249Z-8.173
N12380 G01X144.749Z-8.190
N12390 G01X143.249Z-8.213
...
N15380 G01X0.001
N15390 G01Y1.501
答案 0 :(得分:0)
执行此操作的一种方法是将行放入dict
,其行号为负值。换句话说,就像这样:
lines_to_reverse = {}
line_number = 0
for line in infile:
line_number += 1
....
# if we're in a section that needs to be reversed
lines_to_reverse[-line_number] = line
然后当你想要打印出来时:
for k in sorted(lines_to_reverse.keys()):
print lines_to_reverse[k]
其他替代方案当然是可行的,例如像堆栈一样使用list
(尽管使用deque
会更好地提高性能:
lines_to_reverse = []
for line in infile:
....
lines_to_reverse = [line] + lines_to_reverse
for line in lines_to_reverse:
print line
显然,我并没有重新创建确定你是否在特定群体中所需的所有逻辑,但关键概念是弄清楚如何反转一系列线路,这些线路有多种替代方案......