试图理解KeyError

时间:2015-11-19 07:21:18

标签: python pillow keyerror

我有一个比较图像文件的代码,以检查一个目录中的图像是否与另一个目录中的任何图像匹配。我没有比较文件名,我正在使用PIL,Python Imaging Library来实际比较图像。

我的代码返回一个目录名称没有匹配的列表,这就是我需要的。我有162个图像目录。我的代码成功检查了71个目录,并按预期返回了所需的输出。然后,从目录72开始,我得到以下内容:KeyError: 'F:/162 pic sets ready/set72'用于所有其余目录。

这是我无法理解的部分:如果我将这些目录移动到其他位置,我仍然会得到相同的错误但是如果我将这些目录中的图像复制到另一个空目录中并在这些目录上运行代码我没有收到错误。

from PIL import ImageChops
from PIL import Image
import math, operator
import os

path_images = ('C:/Users/Acer/Desktop/pics/')
list_to_match = []
for images in os.listdir(path_images):
    images_to_match = Image.open(path_images + images)
    list_to_match.append(images_to_match)
path_folders = ('F:/162 pic sets ready/')
d = {}
for dirpath, dirnames, filenames in os.walk(path_folders):
    if 'Thumbs.db' not in filenames:
        d[dirpath] = filenames
dict2 = {k: list(map(lambda x: (k+'/'+x ), v)) for k,v in d.items()}

c = 1
matches = []
folder_images_opened = []
while (c < 163):
    for im in dict2['F:/162 pic sets ready/set%s' % c]:
        test = Image.open(im)
        folder_images_opened.append(test)
    for images_to_find in list_to_match:
        if images_to_find in folder_images_opened:
            matches.append(c)
            print ('Folders where we found a match:', c)
            del folder_images_opened[:]    
    c = c+1
numbers = list(range(1,163))
numbers_filter = [i for i in numbers if i not in matches]
print ('Folders that does not have a match', numbers_filter)

这是完整的追溯:

KeyError                                  Traceback (most recent call last)
<ipython-input-8-c663c9d71cf9> in <module>()
      4 
      5 while (c < 80):
----> 6     for im in dict2['F:/162 pic sets ready/set%s' % c]:
      7         test = Image.open(im)
      8         folder_images_opened.append(test)

KeyError: 'F:/162 pic sets ready/set72'

1 个答案:

答案 0 :(得分:1)

你做了两个假设:

  1. 目录F:/162 pic sets ready/set72实际存在,
  2. 如果存在,则该目录中没有Thumbs.db文件名。
  3. 如果任何一个假设都不成立,那么该路径就不会显示为dict2中的一个键。

    您可以直接测试密钥是否存在:

    while (c < 163):
        dirname = 'F:/162 pic sets ready/set%s' % c
        if dirname not in dict2:
            print('{} does not exist or has a Thumbs.db file'.format(dirname))
            continue
        for im in dict2[dirname]:
            test = Image.open(im)
    

    不是使用while循环并期望所有setx目录按顺序存在,而是循环遍历dict2的键;你甚至可以对键进行排序:

    for dirname in sorted(dict2):
        directoryname = os.path.basename(dirname)  # 'set<somenumber>'
    

    你只想跳过Thumbs.db,而不是跳过包含Thumbs.db的目录(一个很大的区别!)。如果是,请在处理文件时测试文件名,而不是在处理目录时测试:

    for im in dict2['F:/162 pic sets ready/set%s' % c]:
        if os.path.basename(im) == 'Thumbs.db':
            continue
        test = Image.open(im)
        folder_images_opened.append(test)
    

    并完全删除if 'Thumbs.db' not in filenames:测试。