因此,我尝试学习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度。
答案 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
现在,由于在构建数据结构时每个图像/路径元组都已关联,因此您的解压缩工作正常。