对于过去没有任何问题的程序,我收到错误。 文件夹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'
答案 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.
.