反转字符串之间的行顺序

时间:2014-12-12 17:58:19

标签: python string

我在使用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

1 个答案:

答案 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

显然,我并没有重新创建确定你是否在特定群体中所需的所有逻辑,但关键概念是弄清楚如何反转一系列线路,这些线路有多种替代方案......