权限错误:使用Image.open

时间:2018-04-20 08:36:44

标签: python list numpy pillow

我正在使用PIL for Image.open

以下是我的图片路径:

loc = "./data/Flicker8k_reshaped"

当我尝试在此路径中打开图像文件时,使用以下用法打开图像。

Image.open(loc + "/" + train_filenames[0]) # Opens an image 
np.array(Image.open(loc + "/" + train_filenames[0])) # converts that into numpy array

train_filenames是包含我需要使用numpy数组进行矢量化的图像的文件名的列表。

但是当我尝试在循环和列表理解中运行它时,

train = np.array([np.array(Image.open(loc+"/"+fname)) for fname in train_filenames])

我收到以下错误。

---------------------------------------------------------------------------
PermissionError                           Traceback (most recent call last)
<ipython-input-35-90eaea1b75ca> in <module>()
----> 1 train = np.array([np.array(Image.open(loc+"/"+fname)) for fname in train_filenames])
      2 test = np.array([np.array(Image.open(loc+"/"+fname)) for fname in test_filenames])
      3 val = np.array([np.array(Image.open(loc+"/"+fname)) for fname in val_filenames])
      4 
      5 print(train.shape)

<ipython-input-35-90eaea1b75ca> in <listcomp>(.0)
----> 1 train = np.array([np.array(Image.open(loc+"/"+fname)) for fname in train_filenames])
      2 test = np.array([np.array(Image.open(loc+"/"+fname)) for fname in test_filenames])
      3 val = np.array([np.array(Image.open(loc+"/"+fname)) for fname in val_filenames])
      4 
      5 print(train.shape)

C:\Anaconda\envs\tensorflow-cpu\lib\site-packages\PIL\Image.py in open(fp, mode)
   2541 
   2542     if filename:
-> 2543         fp = builtins.open(filename, "rb")
   2544         exclusive_fp = True
   2545 

看起来像

  

builtins.open(filename,“rb”)

我挑选了5个文件名并将其保存在不同的列表中并运行上述语句并在循环中运行代码。它也有效。我认为“这里的错误信息具有误导性。”

1 个答案:

答案 0 :(得分:2)

可能只是train_filenames中的一个文件名无效(即使train_filenames[0]显然有效)。仅用于调试目的(您可以在其工作后稍后将其放回),解压缩您正在使用的列表理解,将图像打开到for循环并添加print语句:

images = []
for fname in train_filenames:
    print(loc+"/"+fname)
    images.append(np.array(Image.open(loc+"/"+fname)))
train = np.array(images)

在获得异常之前打印出的最后一个文件名将是问题所在。显然,在Windows上可能导致PermissionError的一件事是,如果您尝试open a directory as a file...

或者,如果循环在第一个文件之后中断,那么你知道你有一个更奇怪/更难解决问题的手。