2014-10-17 96 views
0

所以我正在閱讀這個PPM文件,逐行閱讀,在這裏和那裏操縱它,並寫出新行到另一個文件。我嘗試製作一個最小的工作示例來重現行爲,但是當我編寫一個最小的示例時,奇怪的行爲消失了 - 但我無法弄清楚這是什麼部分導致了奇怪的行爲。所以完整的代碼如下。奇怪的行爲從枚舉()

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 

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

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

... 

第一行,含「4 4」不應該在那裏。

+0

「當我寫的小例子,行爲怪異消失」是寫在首位最小的例子的原因主要部分。這給你一個完美的方式來進行:加回你跳過的東西的一半。問題是否回來了?然後將其中一半退出。如果沒有,將其餘一半的東西放回去。等等。在大約2-3次迭代中,您通常可以確切地確定事情出錯的地方。 – abarnert 2014-10-17 00:29:13

+0

同時,請提供一些樣本輸入,以及所需的和實際的輸出。 – abarnert 2014-10-17 00:30:44

+0

作爲一個附註,你顯然知道'with'語句,因爲你使用'infile'。那麼爲什麼你不使用'outfile'呢? (另外,你爲什麼重複使用'outfile'這個名字來表示文件名和打開的文件對象?這種事情在調試的時候會導致混亂。) – abarnert 2014-10-17 00:31:57

回答

3

問題是,您在聲明
[None for i in range(width*3)]中更改了i的值。當它遇到if i > 2時,i將是width*3 - 1,其然後評估爲True
只需更改變量名稱([None for j in range(width*3)])即可。請注意0​​表示要打印的第一行將是第四行(索引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 2014-10-17 00:38:21

+1

在這裏使用'elif'而不是'if'也可以解決問題,並且OP確實應該做出更改(或全部三項)。 – abarnert 2014-10-17 00:39:22

+0

不知何故,我不喜歡@minitech提到的那種符號,僅僅是因爲在執行諸如'a = [[1,2]] * 3',然後是'a [0] [0] = 2'時會遇到問題'改變每一個項目。當然,這裏不適用,但我對這種符號產生了非理性的恐懼;) – greschd 2014-10-17 00:46:41