2017-05-16 12 views
-1

3つの別々のフォルダにある複数の.jpg画像を読みたい。 3つのフォルダは同じパスにあります。私はこのようにしようとしました:Python複数のフォルダから複数の画像を読み取る

path1 = os.path.abspath('Type_1') 
path2 = os.path.abspath('Type_2') 
path3 = os.path.abspath('Type_3') 
folder = os.path.join(path1, path2, path3) 

def load_images_from_folder(folder): 
    images = [] 
    for filename in os.listdir(folder): 
     if filename.endswith(".jpg"): 
      img = cv2.imread(os.path.join(folder, filename)) 
      if img is not None: 
       images.append(img) 
      return images 

print(load_images_from_folder(folder)) 

しかし、最後のパスだけを返しますが、すべてではありません。私はまた、次のような相対パスを使用しようとしました:

path1 = os.path.relpath('Type_1') 
path2 = os.path.relpath('Type_2') 
path3 = os.path.relpath('Type_3') 
folder = os.path.join(os.path.sep, path1, path2, path3) 

しかし、それでも同じ問題があります。誰かがこれを助けることができますか?

答えて

1

お客様のreturn images行はループ内にあるため、一致する結果が見つかるとすぐに戻ります。完成したループ全体の後にのみ戻したいと思っています。

ループの後で、になるようにreturnステートメントのインデントを減らします。

def load_images_from_folder(folder): 
    images = [] 
    for filename in os.listdir(folder): 
     if filename.endswith(".jpg"): 
      img = cv2.imread(os.path.join(folder, filename)) 
      if img is not None: 
       images.append(img) 
    return images 

[編集]

あなたは、複数の隣接フォルダに見たい場合は、あなたがこのような何かしたい:

root_folder = '[whatever]/data/train' 
folders = [os.path.join(root_folder, x) for x in ('Type_1', 'Type_2', 'Type_3')] 
all_images = [img for folder in folders for img in load_images_from_folder(folder)] 

フォルダload_imagesを呼び出し、そしてすべて入れます結果を1つのリストにまとめます。

+0

実際に私は、それはまだ動作しないことに気づきました。私が 'print(len(load_images_from_folder(folder)))'を実行すると、** path3 **にある画像の数が返され、** folderではなく** – joasa

+0

@joasa OK、私の編集を参照してください。 – khelwood

+0

_NameError:名前 'folders'が定義されていません。 – joasa

1

私が正しく問題を理解していれば、次のように、あなたのファイル構造が見えます:

- Type1 
    - Image1.jpg 
    - Image2.jpg 
- Type2 
    - Image1.jpg 
    - Image2.jpg 
- Type3 
    - Image1.jpg 
    - Image2.jpg 

これが本当であれば、os.path.joinコールが(それが読み込み、文字列になります誤っています"Type1/Type2/Type3"はあなたのために何もしていません)。

私は次のようにあなたが探しているコードがあると思う:

def load_images_from_folder(folder): 
    images = [] 
    for filename in os.listdir(folder): 
     if any([filename.endswith(x) for x in ['.jpeg', '.jpg']]): 
      img = cv2.imread(os.path.join(folder, filename)) 
      if img is not None: 
       images.append(img) 
    return images 

folders = [ 
    'Type1', 
    'Type2', 
    'Type3', 
] 

for folder in folders: 
    images = load_images_from_folder(folder) 
    # your code that does something with the return images goes here 
+0

私はそれを試みましたが、 'print(len(images))'を実行すると、**フォルダ**内のイメージの総数ではなく、1 1 1(垂直) を返します。パスごとに1つのイメージしか見ることができないと思いますか?しかし、それはなぜですか? – joasa

+0

ああ、私の悪いところです。「戻る」があまりにも遠くにインデントされています。元のコードスニペットと同じように、それをインラインにしておくと良いはずです。 –

関連する問題