os.прогулка, дающая несуществующие каталоги

#python

#python

Вопрос:

У меня есть папка, в которой есть вложенные папки, соответствующие 10 различным классам, и имена этих вложенных папок являются моими ярлыками. Я придумал следующий код для считывания изображений в массив Numpy и сохранения меток.

 import numpy as np
import pandas as pd
import cv2
import glob
import os

x=np.empty([28,28])
y=np.empty([1,0])

for root, dirs, files in os.walk("filepath"):
    for roots in root:
        os.chdir(roots)
        images = np.array([cv2.imread(file) for file in glob.glob(roots "/*.jpg")])
        num_of_images=images.shape[0]
        if num_of_images == 0:
            continue
        else:
            x = np.concatenate((x,images),axis=0)
            labels = np.empty([num_of_images,1])
            labels = labels.astype(str)
            #labels = get from last part of file name in roots
            #y=np.concatenate((y,labels),axis=0)
  

Ошибка, которую я получаю, это

os.chdir(корни) Ошибка FileNotFoundError: [Ошибка 2] Нет такого файла или каталога: ‘U’

Когда я print(root) это дает правильные пути к вложенным папкам. Как мне обработать эту ошибку?

РЕДАКТИРОВАТЬ: Заставил его работать, удалив for roots in root из ОС.walk возвращает 3 кортежа для каждого каталога, где root указывает нам пути к каталогам.

Ответ №1:

Как говорится в документах os.walk(), первый элемент в каждом 3-кортеже, который он возвращает, является строкой. Таким образом, for roots in root: выполняется итерация по символам строки. Вам нужно внимательно прочитать, какую структуру данных os.walk() возвращает, и соответствующим образом реструктурировать ваш скрипт.

Ответ №2:

Другие уже указывали, что не так, поэтому я не буду это повторять. Я просто добавлю, что вам следует использовать

 help(os.walk)
  

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

Вы обрабатываете эту ошибку следующим образом:

 import os

for root, dirs, files in os.walk(path):
    for thedir in dirs:
        p = os.path.join(root, thedir)
        os.chdir(p)
  

Ответ №3:

root будет строкой; имя текущего каталога os.walk .

 for roots in root:
  

будет выполнять итерацию по этой строке; roots будет выполнять итерацию по root одному символу за раз… os.chdir(some character) не будет работать.

Комментарии:

1. Ах. Значит, я должен использовать каталоги вместо этого?

2. я предлагаю вам распечатать root, dirs, files , чтобы посмотреть, что это такое, а затем приступить к тому, что вам нужно. я не уверен, что вызов os.chdir во время повторения os.walk будет работать так, как ожидалось…