Изображения не открываются с использованием Image.open (fnames), и в коде есть «список» объект не имеет атрибута «читать» ошибка - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть несколько подпапок (s1, s2, s3, ...). Я хочу открыть изображения в подпапках в папке «Изображение» по пути:
«E: / Image /» и покажи им. Но изображения не могут быть открыты.

import os
from PIL import Image
root = "E:/Image/" 
path = os.path.join(root,"")
for r in os.walk(path):
     for file in r:
        fnames = glob.glob(f'{root}{r}/{file}')
        img1 = Image.open(fnames)
        img1.show()  

Мой код содержит эту ошибку:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~\Anaconda3\lib\site-packages\PIL\Image.py in open(fp, mode)
   2546     try:
-> 2547         fp.seek(0)
   2548     except (AttributeError, io.UnsupportedOperation):

AttributeError: 'list' object has no attribute 'seek'

During handling of the above exception, another exception occurred:

AttributeError                            Traceback (most recent call last)
<ipython-input-5-e9dafc96965e> in <module>()
      9         fnames = glob.glob(f'{root}{r}/{file}')
     10 
---> 11         img1 = Image.open(fnames)
     12        
     13         img1.show()

~\Anaconda3\lib\site-packages\PIL\Image.py in open(fp, mode)
   2547         fp.seek(0)
   2548     except (AttributeError, io.UnsupportedOperation):
-> 2549         fp = io.BytesIO(fp.read())
   2550         exclusive_fp = True
   2551 

AttributeError: 'list' object has no attribute 'read'

1 Ответ

0 голосов
/ 01 мая 2018

Вы получаете исключение, потому что вместо имени файла вы передаете список Image.open.

Однако основные проблемы, которые я вижу, связаны с неправильным использованием os.walk и glob.glob. Я предлагаю внимательно прочитать документацию, прежде чем использовать функции, которых вы не знаете.

уточнение:

  • os.walk не возвращает имена файлов в path, но, рекурсивно, каталог (dirpath), список подкаталогов (dirnames) и список файлов в каталоге ( filenames). Вы можете получить все имена файлов, просто набрав os.path.join(dirpath, name) для каждого name in in filenames.
  • glob.glob возвращает список файлов, соответствующих заданным групповым символам. Из вашего кода я предполагаю, что вы ожидаете, что f'{root}{r}/{file}' - это имя файла в системе, поэтому нет необходимости усложнять вашу жизнь, используя glob.glob

пара замечаний:

  • , поскольку у вашего root уже есть трейлинг /, вызов os.path.join(root,"") ничего не делает;
  • если вы хотите создавать пути к файлам программным способом, не добавляйте разделители путей вручную, но старайтесь максимально использовать os.path.join (или при необходимости os.sep) (это помогает поддерживать кросс-систему совместимость). Как пример вместо того, чтобы делать

    root = "E:/Image/" 
    r = 'folder'
    file = 'test.txt'
    fname = f'{root}{r}/{file}'
    

    использование

    root = "E:/Image" 
    r = 'folder'
    file = 'test.txt'
    fname = os.path.join(root, r, file)
    

код

А теперь «правильный» код. Поскольку я не знаю вашу структуру каталогов, регистр пользователя и т. Д., Код теперь может работать так, как вы хотите, но я надеюсь, что вы сможете адаптировать его под свои нужды.

import os
from PIL import Image

root = "E:/Image/" 
for dirpath, _, filenames in os.walk(path):
    # we don't care about ``dirnames``
    for name in filenames:
        fname = op.path.join(dirpath, name)
        img1 = Image.open(fname)
        img1.show()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...