【发布时间】:2014-10-17 00:17:08
【问题描述】:
所以我正在读取这个 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”的第一行不应该在那里。
【问题讨论】:
-
“当我编写最小示例时,奇怪的行为就会消失”是首先编写最小示例的主要原因。这为您提供了一种完美的继续方式:将您跳过的一半内容添加回来。问题又回来了吗?然后取出一半。如果没有,把剩下的一半放回去。等等。在大约 2-3 次迭代中,您通常可以准确地确定哪里出了问题。
-
同时,请提供一些示例输入,以及期望的和实际的输出。
-
附带说明一下,您显然知道
with语句,因为您使用的是infile语句。那么你为什么不也使用一个outfile呢? (另外,你为什么要重复使用名称outfile来表示文件名和打开的文件对象?这种事情肯定会在调试时导致混乱。)
标签: python python-2.7 enumerate