2017-02-19 3 views
0

Ich versuche, verschiedene Bilddateien in einem Verzeichnis zu durchlaufen. Ich verwende Jupyter, um auch meinen Python-Code auszuführen. Allerdings bekomme ich diesen Fehler immer wieder. Unten ist mein Code und der Fehler, den ich erhalte.JPG-Dateien in einem Verzeichnis lesen?

Code:

import os 
import os.path 
for img in os.listdir('test_images'): 
    if img.endswith("jpg"): 
     scriptpath = os.path.dirname(img) 
     print(os.path.join('test_images', img)) 
     # Read in the image 
     image = os.path.join(scriptpath, img) 
     image = mpimg.imread(image) 
     # Grab the x and y size and make a copy of the image 
     ysize = image.shape[0] 
     xsize = image.shape[1] 
     color_select = np.copy(image) 
     # Define color selection criteria 
     red_threshold = 200 
     green_threshold = 200 
     blue_threshold = 200 

     rgb_threshold = [red_threshold, green_threshold, blue_threshold] 

     # Do a boolean or with the "|" character to identify 
     # pixels below the thresholds 
     thresholds = (image[:,:,0] < rgb_threshold[0]) \ 
        | (image[:,:,1] < rgb_threshold[1]) \ 
        | (image[:,:,2] < rgb_threshold[2]) 
     color_select[thresholds] = [red_threshold,green_threshold,blue_threshold] 
     plt.imshow(color_select) 
     # Display the image     
     plt.imshow(color_select) 
     continue 
    else: 
     continue 

OUTPUT:

test_images/solidWhiteCurve.jpg 

ERROR:

FileNotFoundError       Traceback (most recent call last) 
<ipython-input-3-6edf7c0860b7> in <module>() 
     7   # Read in the image 
     8   image = os.path.join(scriptpath, img) 
----> 9   image = mpimg.imread(image) 
    10   # Grab the x and y size and make a copy of the image 
    11   ysize = image.shape[0] 

/Users/steveburgos/anaconda/envs/carnd-term1/lib/python3.5/site-packages/matplotlib/image.py in imread(fname, format) 
    1225 
    1226  if ext not in handlers: 
-> 1227   im = pilread(fname) 
    1228   if im is None: 
    1229    raise ValueError('Only know how to handle extensions: %s; ' 

/Users/steveburgos/anaconda/envs/carnd-term1/lib/python3.5/site-packages/matplotlib/image.py in pilread(fname) 
    1203   except ImportError: 
    1204    return None 
-> 1205   with Image.open(fname) as image: 
    1206    return pil_to_array(image) 
    1207 

/Users/steveburgos/anaconda/envs/carnd-term1/lib/python3.5/site-packages/PIL/Image.py in open(fp, mode) 
    2310 
    2311  if filename: 
-> 2312   fp = builtins.open(filename, "rb") 
    2313 
    2314  try: 

FileNotFoundError: [Errno 2] No such file or directory: 'solidWhiteCurve.jpg' 
+1

'scriptpath' wird immer eine leere Zeichenfolge sein, da' os.listdir' blanke Dateinamen zurückgibt. Versuchen Sie, 'os.path.join (scriptpath, img)' (den Pfad, den Sie öffnen) anstelle von 'os.path.join ('test_images', img)' zu drucken. – unutbu

+0

@unutbu Du bist großartig! Das hat perfekt funktioniert! Ich danke dir sehr! –

+1

Ich würde vorschlagen, ['glob.glob'] (https://docs.python.org/3/library/glob.html#glob.glob) mit einem Argument _pathname_ zu verwenden, das mit' * .jpg' endet. – martineau

Antwort

2

Sie einen Pfad Konflikt in Ihrem Code haben, und Ihr Fehler klar es zeigt (Datei nicht gefunden). Wenn Sie das tun:

for img in os.listdir('test_images'): 

Sie die Auflistung der test_images Verzeichnis im aktuellen Verzeichnis. Die img enthält Werte in Form von file1.ext, file2.ext usw. als os.listdir() Listen nur die Namen von Dateien und Verzeichnissen in sie, so, wenn Sie anrufen:

scriptpath = os.path.dirname(img) 

Sie im Wesentlichen nichts ges werden, weil die img doesn‘ t enthalten keine Pfadinformationen. So, endlich, wenn Sie das tun:

image = os.path.join(scriptpath, img) 

Sie technisch nur die Dateinamen übergeben als scriptpath leer. Da sich Ihr Image im Unterverzeichnis test_images befindet und nicht in Ihrem Arbeitsverzeichnis, wird die Datei normalerweise nicht gefunden.

Es gibt mehr Möglichkeiten, dieses Problem zu lösen, wäre die einfachste, nur ein Lookup-Verzeichnis in einer Variablen deklarieren und bei Bedarf verwenden, zum Beispiel:

target_path = "test_images" 
# ... 
for img in os.listdir(target_path): 
# ... 
    image = os.path.join(target_path, img) 
0

Meiner Meinung nach ziehe ich die glob mit Bibliothek, um eine Liste von Dateien in einem Verzeichnis zurückzugeben. import glob print (glob.glob("/home/peter/pictures/*.png")

kehrt: ['/home/peter/pictures/pic1.png', '/home/peter/pictures/pic2.png', '/home/peter/pictures/pic3.png', ...ect]

Wenn Sie mit Ihrem Ansatz fortsetzen wollen, ich bin sicher, dass Sie nicht den korrekten Pfad zu dem Ordner Verzeichnis geben. Denken Sie darüber nach, wie das Programm weiß, wo sich test_images befindet.

Verwandte Themen