遍历返回包含两个列表的2元组的函数吗?

时间:2019-08-27 20:14:35

标签: python python-imaging-library

因此,我尝试学习PIL的图像库,并且第二次被卡住。我想做的是通读目录及其所有子目录,并且仅在用户输入的特定路径(或在脚本中指定)中加载,旋转和替换图像。问题是代码中的行()尝试遍历返回的包含元组的2元组的函数,该元组包含一个包含Imageobjects的列表,另一个包含字符串的列表会引发错误“ ValueError:太多值无法解包(预期2)”。

我尝试在单独的脚本中执行类似的功能,该脚本返回与get_subdirectory_images()函数仅在不使用任何模块的情况下返回的相同类型的2元组。

具有错误的真实文件:

try:
    from PIL import Image
    from PIL import ImageEnhance
except ImportError:
    print("Please install Pillow using pip" + "\n\n")

import os

inp = "C:\\Users\\Isak Blomster\\AppData\\Roaming\\.minecraft\\resourcepacks\\The python script pack\\assets\\minecraft\\textures\\items"
os.path.relpath(str(inp))

def get_subdirectory_images(target_directory_list, file_extension):

    images = []
    image_paths = []

    for current_directory, subdirectory_names, file_names in os.walk("."):

        tupl = (current_directory, subdirectory_names, file_names)
        #print(tupl)

        for target_directory in target_directory_list:

            if os.path.realpath(target_directory) == os.path.realpath(current_directory):
                #print("test")

                for name in file_names:

                    if name.endswith(file_extension):

                        image_path = os.path.join(current_directory, name)
                        image = Image.open(image_path)

                        images.append(image)
                        image_paths.append(image_path)

    return images, image_paths;

#print((get_subdirectory_images([str(inp)], ".png")))
for images, paths in get_subdirectory_images([str(inp)], ".png"):
    print("Test")
    rotated = images.rotate(90)
    rotated.save(paths)

运行时会返回此值:

ValueError: too many values to unpack (expected 2)

这只是我似乎可以按自己的意愿工作的一个小规模范围?

class Image:
    """docstring for Image"""
    x = 0
    def __init__(self, x):
        self.x = x

    def give_xy(self, y):
        xy = self.x * y
        return xy
i = 0

def function(num1, num2):

    A = Image(num1)
    B = Image(num2)

    string_list = ["wow", "wow2"]
    object_list = [A, B]

    return string_list, object_list

for a, b in function(1, 2):
    i += 1
    if i > 1:
        print(a.give_xy(3), b.give_xy(4))

它返回

3 8

预期结果是应该将item子文件夹中的所有图像旋转90度。

1 个答案:

答案 0 :(得分:0)

return images, image_paths

您的函数返回一个一个元组,其中包含两个相同大小的列表。

现在for循环对结果进行迭代,并首先产生images,这是图像列表(超过2张图像),不能包含2个变量。这说明了错误消息。

您本可以构建字典或元组列表,但是如果要迭代/关联图像和路径,则必须对压缩结果进行迭代

for images, paths in zip(*get_subdirectory_images([str(inp)], ".png")):

(变量名应为image, path,更合乎逻辑)

如上所述,返回2个列表的元组(必须将它们关联在一起才能正确处理)不是一种好方法。

代替:

images.append(image)
image_paths.append(image_path)

只需在开始时使用images = [],然后:

images.append((image,image_path))

然后

return images

现在,由于在构建数据结构时每个图像/路径元组都已关联,因此您的解压缩工作正常。