Python:AttributeError:'tuple'对象没有属性'read'

时间:2015-08-08 06:53:24

标签: python

对于过去没有任何问题的程序,我收到错误。 文件夹xxx_xxx_xxx包含许多jpeg格式的图像文件。

我正在尝试浏览每个图像并检索每个图像上每个像素的色调值。

我已经尝试了这里提出的解决方案:Python - AttributeError: 'tuple' object has no attribute 'read'和此处:AttributeError: 'tuple' object has no attribute 'read'但没有成功。

代码:

from PIL import Image
import colorsys
import os

numberofPix = 0
list = []
hueValues = 361
hueRange = range(hueValues)

for file in os.walk("c:/users/xxxx/xxx_xxx_xxx"):
    im = Image.open(file)
    width, height = im.size
    rgb_im = im.convert('RGB')

    widthRange = range(width)
    heightRange = range(height)

    for i in widthRange:
        for j in heightRange:
            r, g, b = rgb_im.getpixel((i, j))
            if r == g == b:
                continue
            h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
            h = h * 360
            h = int(round(h))
            list.append(h)
            numberofPix = numberofPix + 1

for x in hueRange:
    print "Number of hues with value " + str(x) + ":" + str(list.count(x))

print str(numberofPix)

这是我得到的错误:

AttributeError: 'tuple' object has no attribute 'read'

1 个答案:

答案 0 :(得分:1)

我不知道此代码之前是如何工作的(特别是如果之前的行 - for file in os.walk("c:/users/nathan/New_Screenshots_US/Dayum"):也存在),该行是导致问题发生的主要原因。

os.walk返回格式为元组的元组 - (dirName, subDirs, fileNames) - 其中dirName是当前正在运行的目录的名称,fileNames是该特定目录中的文件列表。

在下一行 - im = Image.open(file) - 这不起作用,因为file是一个元组(上述格式)。您需要迭代每个文件名,如果文件是.jpeg,那么您需要使用os.path.join创建文件的路径并在Image.open()中使用它。

示例 -

from PIL import Image
import colorsys
import os
import os.path

numberofPix = 0
list = []
hueValues = 361
hueRange = range(hueValues)

for (dirName, subDirs, fileNames) in os.walk("c:/users/nathan/New_Screenshots_US/Dayum"):
    for file in fileNames:
        if file.endswith('.jpeg'):
            im = Image.open(os.path.join(dirName, file))
            . #Rest of the code here . Please make sure you indent them correctly inside the if block.
            .