使用Python 3.x正确读取ppm文件

时间:2014-04-08 19:16:50

标签: validation python-3.x formatting ppm

我正在尝试从文件中读取数据,例如:

    P3
    400 200
    255
    255 255 255
    0 255
    0
    0 0 0

我需要考虑前4个数字不是像素数据,而是创建图像的重要信息。我已经编写了下面的代码,但是我不确定如何正确地获取前4个数字,将它们用于我的程序的不同部分,然后读取其余的图像数据。

1 个答案:

答案 0 :(得分:1)

你是微观优化。将整个PPM图像读入字符串并不“非常麻烦”。事实证明,我有一个720x540 PPM,所以我用Python打开它:

Python 3.4.0 (default, Mar 17 2014, 23:20:09) 
[GCC 4.8.2 20140206 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> with open('ppm/cake.ppm', 'r') as ppm:
...   data = ppm.read()
... 

由于我没有参数调用readdata现在包含整个图像作为字符串。请注意,这些命令像往常一样立即执行。没有明显的减速。我可以对它们执行正常操作:

>>> values = data.split()
>>> values[0]
'P3'
>>> values[1]
'720'
>>> values[2]
'540'
>>> values[3]
'255'

所以你可以看到它是一个P3编码的PPM,720px高,540px宽。请注意,value[3:]现在只包含颜色信息(而不是标题)。

即使我将信息量增加一倍,我也没有采取任何特殊预防措施,从而没有性能下降或延迟:

>>> values += values[3:]
>>> len(values)
2332805

你可以做各种各样的事情来处理比Python更大的数据(例如使用生成器),这个代码在两个桌面(具有大不相同的年龄和硬件配置)上为我处理相同的事情,现代笔记本电脑和虚拟机。简而言之,您不必担心这些预防措施。只需按照简单的方式做事,然后继续使用PPM图像做一些很酷的事情。 :)

修改

嘿,看,我做了找到需要一秒钟的东西。第二个。

>>> encoding, height, width, *values = data.split()
>>> rgb = [tuple(values[i:i+3]) for i in range(0, len(values), 3)]
>>> rgb[:10]
[('255', '123', '125'), ('124', '124', '126'), ('125', '127', '129'), ('128', '129', '131'), ('130', '128', '130'), ('129', '126', '128'), ('127', '132', '134'), ('133', '132', '135'), ('134', '135', '140'), ('139', '137', '143')]