2014-12-12 2 views
1

저는 Python으로 프로그램을 작성하는 데 어려움을 겪고 있습니다. 나는 프로그램이 일련의 문자들 사이에서 줄을 읽고, 줄의 순서를 반대로하고, 그 줄들을 새로운 파일에 쓰길 원한다. 입력은 다음과 같습니다목록의 행 순서 반전

AN10 G17 G21 G90 
N20 '2014_12_08_Banding_Test_4 
N30 M3 S1B 
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 
... 
N3140 G01Y0.501 

지금까지 내 코드는 다음과 같습니다

with open('Source.nc') as infile, open('Output.nc', 'w') as outfile: 
    copy = False 
    strings_A = ("G01Y", ".251") 
    strings_B = ("G01Y", ".501") 
    content = infile.readlines() 
    for lines in content: 
     lines.splitlines(1) 
     if all(x in lines for x in strings_A): 
      copy = True 
     elif all(x in lines for x in strings_B): 
      copy = False 
     elif copy: 
      outfile.writelines(reversed(lines)) 

나는 라인과 멀티 다중 문자열 사이의 차이에 대해 뭔가를 이해하는 데 실패하고 생각합니다. 나는 정말로 여기에서 약간의 도움에 감사 할 것이다! 사전에

감사합니다, 아서

+0

splitlines 뭔가를 반환하는 메도,하지만 당신은 반환 값을 무시 : 응답에서

EDIT2는 언급합니다. 따라서이 문장은 영향을 미치지 않으므로 프로그램에서 삭제할 수 있습니다 – miracle173

+0

알고리즘에 대한 설명을 이해하지 못합니다. "문자 집합 사이에 줄을 읽는"것은 무엇을 의미합니까? 행의 순서가 바뀌 었는지 또는 각 행의 문자 순서인지 여부. 기대 한 결과를 입력에 추가하면 도움이됩니다. 당신은 당신의 프로그램을 디버그하고 변수들이 당신이 기대하는 것과 일치하는지 점검해야한다. – miracle173

답변

2

가 개행 문자 \n 포함 된 경우 문자열이 여러 줄이 있습니다.

당신은 개행 문자가 포함 된 하나 하나의 긴 문자열로 파일을 생각할 수 있습니다 :

s = infile.read() 

또는 라인의 목록처럼 취급 할 수

lines = infile.readlines() 

당신은 여러 줄이있는 경우 문자열을 줄 목록으로 나눌 수 있습니다.

lines = s.splitlines(False) 
# which is basically a special form of: 
lines = s.split('\n') 

파일 줄을 처리하려면 선으로 다음 방법 중 모두 (그렇지 않으면 효율 효과) 동일 : 이제

with open(filename, 'r') as f: 
    s = f.read() 
    lines = s.splitlines() 
    for line in lines: 
    # do something 
    pass 

with open(filename, 'r') as f: 
    lines = f.readlines() 
    for line in lines: 
    # do something 
    pass 

# this last option is the most pythonic one, 
# it uses the fact that any file object can be treated as a list of lines 
with open(filename, 'r') as f 
    for line in f: 
    # do something 
    pass 

편집 문제의 해결책 :

with open('Source.nc') as infile, open('Output.nc', 'w') as outfile: 
    copy = False 
    strings_A = ("G01Y", ".251") 
    strings_B = ("G01Y", ".501") 
    target_lines = [] 
    for line in infile: 
     if copy and all(x in line for x in strings_B): 
      outfile.writelines(reversed(target_lines)) 
      break 

     if copy: 
      target_lines.append(line) 

     if all(x in line for x in strings_A): 
      copy = True 

이 라인 사이의 모든 라인을 복사합니다 all(x in line for x in strings_A)과 일치하고 all(x in line for x in strings_B)과 일치하는 행은 반대 순서로 outfile에 일치합니다. 식별 라인은 산출물에 포함되지 않습니다 (나는 그것이 의도라고 생각합니다). if 조항의 순서는이를 달성하기 위해 계획된 것입니다.

당신이 사용하는 식별 테스트 (all(x in line for x in strings_A))는 단어 일치가 아닌 하위 문자열 검색으로 작동하므로, 의도 한 것인지 다시 알 수 있습니다.

with open('Source.nc') as infile, open('Output.nc', 'w') as outfile: 
    strings_A = ("G01Y", ".251") 
    strings_B = ("G01Y", ".501") 
    do_reverse = False 
    lines_to_reverse = [] 
    for line in infile: 
     if all(x in line for x in strings_B): 
      do_reverse = False 
      outfile.writelines(reversed(lines_to_reverse)) 
      outfile.writeline(line) 
      continue 

     if do_reverse: 
      lines_to_reverse.append(line) 
      continue 
     else: 
      outfile.writeline(line) 

     if all(x in line for x in strings_A): 
      do_reverse = True 
      lines_to_reverse = [] 
+0

Peter. 고맙습니다. 이것은 내가 성취하고자하는 중요한 단계입니다. AN10 G17 G21 G90 N20 '2014_12_08_Banding_Test_4 N30 M3 S1B N40G00X0.000Y0 : 그것은 다음과 같습니다 그래서 나는 원래 순서를 유지하기 위해 반대되는 "target_lines"이 캐릭터 이외의 다른 라인 내에서 텍스트를 싶습니다 .000Z17.000 N50 G00X0.001Y0.001Z17.000 N60 G01Z0.000F3900.0 N70 G01X0.251 N80 G01X149.999이 비트가 N100 G01X149.749 N110 G01X149를 반전 #now N90 G01Y0.251 .499Z-8.169 N120G01X148.249Z-8.173 N130G01X146.999Z-8.183 N140G01X145.499Z-8.201 여기까지 N3140 G01Y0.501 –

+0

피터에게 나에게 이메일을 보내십시오. [email protected] - 나는 당신에게 명제가 있습니다;) –