【问题标题】:Permission Error: Using Image.open权限错误:使用 Image.open
【发布时间】:2018-04-20 08:36:43
【问题描述】:

我正在为 Image.open 使用 PIL

以下是我的图片路径:

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 个文件名并将其保存在不同的列表中,然后运行上述语句并在循环中运行代码。它也奏效了。我认为这里的“错误信息具有误导性。”

【问题讨论】:

  • 您是否有权打开该目录中的文件?
  • 是的,我愿意。这就是我可以在循环外打开它的方式
  • 当 open 语句在循环内时会出现权限错误而在循环外不会出现权限错误,这是没有意义的。在循环之外,您打开一个文件。在循环中,您打开几个文件。如果您甚至没有打开其中一个的权限,您将收到错误消息。您检查了所有文件吗?
  • 这显然是导致您的问题的一个特定文件/文件名。你只需要弄清楚哪个是烂苹果
  • 天啊。那是一个空行:-(

标签: python list numpy pillow


【解决方案1】:

可能只是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...

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

【讨论】:

  • 这是一个空行。没有文件名。但错误信息有点误导
  • 就可以了。令人讨厌的是,同样的问题在 Unix/Mac 上引发了不同的异常 (FileNotFoundError)。那个更简单一点
  • 如果它是 FileNotFound,它会有一点明确的意义。谢谢
猜你喜欢
  • 2018-10-24
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多