IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak načítat soubory ze složky

V předchozím kvízu, Online test znalostí Python 2.7, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Mentee
Člen
Avatar
Mentee:25.10.2017 19:57

Ahoj,
snažím se analyzovat obrázky. Mám již kód, který mi počítá průměrnou barvu obrázku. Jenže můj program načte vždy jeden obrázek a skončí, pro další musím znovu opravit adresu obrázku. Jak mohu udělat, aby mi program načítal sám všechny obrázky ze souboru a skončí, až projde všechny obrázky ve složce?

Odpovědět
25.10.2017 19:57
Do something. If it does not work, do something else. Nothing is too crazy!
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Mentee
gcx11:26.10.2017 2:40

Ahoj, na to potřebuješ toto:
https://docs.python.org/…rary/os.html#…
Místo jednoho souboru zpracuješ všechny soubory, co to najde.

 
Nahoru Odpovědět
26.10.2017 2:40
Avatar
Mentee
Člen
Avatar
Odpovídá na gcx11
Mentee:26.10.2017 11:36
images=os.listdir(path='C:\TestData')

for file in images:

    img=cv2.imread('file')

    red = img[:,:,2]
    green = img[:,:,1]
    blue = img[:,:,0]

Když to takto napíšu, tak vrátí chybu:
red = img[:,:,2]
TypeError: 'NoneType' object is not subscriptable

Co mám špatně?

Nahoru Odpovědět
26.10.2017 11:36
Do something. If it does not work, do something else. Nothing is too crazy!
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Mentee
gcx11:26.10.2017 12:09
img=cv2.imread('file')

To čteš soubor se jménem 'file'.

Musíš použít toto:

img=cv2.imread(file)
 
Nahoru Odpovědět
26.10.2017 12:09
Avatar
Mentee
Člen
Avatar
Odpovídá na gcx11
Mentee:26.10.2017 12:17

To už jsem také zkoušela, vrací stále stejnou chybu.

Nahoru Odpovědět
26.10.2017 12:17
Do something. If it does not work, do something else. Nothing is too crazy!
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Mentee
gcx11:26.10.2017 12:49

Protože v té cestě by mělo být lomítko zdvojené, aby se bralo jako lomítko nebo použij raw string:

images=os.listdir(path=r'C:\TestData')
Editováno 26.10.2017 12:49
 
Nahoru Odpovědět
26.10.2017 12:49
Avatar
Mentee
Člen
Avatar
Odpovídá na gcx11
Mentee:26.10.2017 13:03

Opravila jsem to, ale stále to nefunguje. Co jiného by ještě mohlo být špatně?

Nahoru Odpovědět
26.10.2017 13:03
Do something. If it does not work, do something else. Nothing is too crazy!
Avatar
Mentee
Člen
Avatar
Mentee:26.10.2017 13:11

Už vím, co je špatně. Hledá ty obrázky ve stejné složce, jako je zdroják, ale nenajde je, jsou ve složce TestData, tak vrátí chybu. Jak mám opravit

img=cv2.imread(file)

aby to nenačítalo file, ale C:\TestData\file ?

Nahoru Odpovědět
26.10.2017 13:11
Do something. If it does not work, do something else. Nothing is too crazy!
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Mentee
gcx11:26.10.2017 13:16
path=r'C:\TestData'
images=os.listdir(path)

for file in images:

    img=cv2.imread(os.path.join(path, file))

    # toto mi přijde divné
    red = img[:,:,2]
    green = img[:,:,1]
    blue = img[:,:,0]
Editováno 26.10.2017 13:16
 
Nahoru Odpovědět
26.10.2017 13:16
Avatar
Mentee
Člen
Avatar
Odpovídá na gcx11
Mentee:26.10.2017 13:36

Teď už je cesta k obrázkům správná, ale i tak se do proměnné img obrázek neuloží.
Co je divné na následujícím kódu? Chtěla jsem získat pole s hodnotami RGB, nevím jak jinak to udělat.

Nahoru Odpovědět
26.10.2017 13:36
Do something. If it does not work, do something else. Nothing is too crazy!
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Mentee
gcx11:26.10.2017 14:41

Název toho souboru?

 
Nahoru Odpovědět
26.10.2017 14:41
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Mentee
gcx11:26.10.2017 14:48

Toto by mělo fungovat:

#!/usr/bin/env python3

import os
import cv2
import numpy

path = r'C:\TestData'
files = os.listdir(path)

for file in files:

    with open(os.path.join(path, file), "rb") as f:
        b = bytearray(f.read())
        numpyarray = numpy.asarray(b, dtype=numpy.uint8)
        img = cv2.imdecode(numpyarray, cv2.IMREAD_UNCHANGED)
        print(img)
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
26.10.2017 14:48
Avatar
Mentee
Člen
Avatar
Odpovídá na gcx11
Mentee:26.10.2017 14:56

Super, funguje to! Díky moc :)

Nahoru Odpovědět
26.10.2017 14:56
Do something. If it does not work, do something else. Nothing is too crazy!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.