2014-10-17 4 views
0

그래서이 PPM 파일을 한 줄씩 읽고, 여기저기서 조작하고, 새 줄을 다른 파일에 쓰고 있습니다. 최소한의 예제를 작성하여 최소한의 예제 만 작성하면 이상한 행동이 사라지지만 이상한 행동을 일으키는 부분이 무엇인지 알 수는 없습니다. 그래서 전체 코드는 아래에 있습니다.enumerate()에서 이상한 동작

def flip_horizontal(infile, outfile): 
with open(os.getcwd() + '\\' + infile, 'r') as f: 
    outfile = open(os.getcwd() + '\\' + outfile, 'w') 
    rgbCounter = 0 
    for i, line in enumerate(f): 
     if i < 3: 
      outfile.write(line) 
     if i == 1: 
      width = int(line.split()[1]) 
      lineList = [None for i in range(width*3)] 
      if width > 1024: 
       print "Image size too large: Buffer can only store 1024 \ 
        pixels at a time. Aborting negate_red." 
       break 
     if i > 2: 
      print line 
      for integer in line.split(): 
       if rgbCounter%3 == 0: 
        lineList[width*3-rgbCounter-3] = integer 
       elif rgbCounter%3 == 1: 
        lineList[width*3-rgbCounter-1] = integer 
       else: 
        lineList[width*3-rgbCounter+1] = integer 
       rgbCounter += 1 
       if rgbCounter == width*3: 
        outfile.write(' '.join(lineList)) 
        outfile.write('\n') 
        rgbCounter = 0 
    outfile.close() 

그리고 여기에 문제의 :이 코드를 실행하면, if i > 2: 후 "인쇄"라인도 라인 2를 출력 (또는 오히려, 라인 3, 라인 2에 색인)! 더 최소한의 예에서, 난 그냥 말한다면

... 
if i > 2: 
    print line 
... 

그것은만이 인쇄 라인 4 이후,하지만 실제로 실행하고있어 코드의 나머지 부분에 대해 뭔가가 그것을 인쇄 라인을 만드는 3. 어떤 아이디어 왜 이 문제를 해결하는 방법?

다음은 샘플 입력입니다 :

P3 
4 4 
255 
49 49 49 100 100 100  0 200 0  0 0 0 
100 100 100 100 0  0  200 200 200 255 255 255 
200 100 0  0  100 200  0 0  0  50 50 50 
0 0 0  0  0  0  0 0  0  0 0 0 

내가 코드를 실행할 때 내가 거기 안 "4 4"를 포함하는, 인쇄 라인

4 4 

49 49 49 100 100 100  0 200 0  0 0 0 

100 100 100 100 0  0  200 200 200 255 255 255 

... 

첫 번째 라인을 얻을.

+0

처음에 최소한의 예를 작성하는 이유의 큰 부분이다. 진행할 수있는 완벽한 방법을 제공합니다. 건너 뛴 부분의 절반을 다시 추가하십시오. 문제가 다시 발생 했습니까? 그런 다음 절반을 다시 꺼내십시오. 그렇지 않다면 남은 물건의 반을 다시 넣으십시오. 2 ~ 3 회 정도 반복하면 일반적으로 문제가 발생한 부분을 정확히 파악할 수 있습니다. – abarnert

+0

한편, 몇 가지 샘플 입력과 원하는 출력 및 실제 출력을 제공하십시오. – abarnert

+0

부수적으로,'with' 명령문에 대해서 알고 있습니다. 왜냐하면'infile'을 사용하고 있기 때문입니다. 그래서 왜 당신은'outfile'을 위해서 하나도 사용하지 않습니까? (또한, 왜'outfile'이라는 이름을 파일명과 열린 파일 객체 모두로 재사용하고 있습니까? 디버깅하는 동안 혼란을 가져올 수 있습니다.) – abarnert

답변

3


문에서 i의 값을 변경하려고하면 문제가 발생합니다. iif i > 2을 만나면 width*3 - 1이되고, True이됩니다.
단순히 변수 이름 ([None for j in range(width*3)])을 변경하면 트릭을 수행하게됩니다. i > 2은 인쇄 할 첫 번째 줄이 네 번째 줄 (색인 3)임을 의미합니다. 세 번째로 인쇄하려면 if i > 1을 사용해야합니다. 동작을 보여주는
최소한의 예 : "나는 이상한 행동이 사라질 때 최소한의 예를 쓸 때"

def test(): 
    a = ['a', 'b', 'c', 'd'] 
    for i, char in enumerate(a): 
     if i==1: 
      var = [None for i in range(4)] 
     if i>2: 
      print(i, char) 
      test() 
+0

또는'[None] * (width * 3) '! – Ryan

+1

여기에서'if' 대신에'elif'를 사용하면 문제가 해결 될 것이고, OP는 실제로 두 가지 모두 변경해야합니다. – abarnert

+0

어쨌든'@ = [[1,2]] * 3', 그리고'a [0] [0] = 2와 같은 일을 할 때 문제가 발생할 수 있기 때문에 @minitech 표기법을 좋아하지 않습니다. '모든 항목을 변경합니다. 물론 여기서는 적용되지 않지만 그 표기법에 대한 비합리적인 두려움이 생겼습니다.) – greschd