2014-12-12 2 views
0

저는 파이썬으로 작성하는 스크립트에 어려움을 겪고 있습니다. 나는 누군가가 나를 도울 수 있기를 바랍니다. 내 프로그램에서 일련의 문자 사이에 줄을 읽고, 줄의 순서를 반대로 변경 한 다음 새 줄에 쓰기를 원합니다. 아래 텍스트에서 "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 = [] 

소스 코드 : 그들의 행 번호의 부정적인와 dict에 라인을 넣어하는 것이 작업을 수행하는

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

한 가지 방법 키. 즉,이 같은 :

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를 사용하는 것과 같이, 확실히 가능하다 (A deque를 사용하지만 것 수 더 나은 성능 현명한 :

lines_to_reverse = [] 

for line in infile: 
    .... 
    lines_to_reverse = [line] + lines_to_reverse 

for line in lines_to_reverse: 
    print line 
분명히

, 난 당신이 특정 그룹 또는 N에있을 때 당신이 결정에 필요한 모든 로직을 다시 아니에요 그러나 핵심 개념은 여러 대안을 가진 일련의 줄을 뒤집는 방법을 알아내는 것입니다.