Для имени файла в os.listdir (каталог) вызывает исключение "имя" имена файлов не определены "после модификации - PullRequest
0 голосов
/ 18 апреля 2020

Итак, я недавно начал программировать Python (3). Это было для проекта об "усреднении изображений"; возьмите пиксельные значения изображений, найдите среднее значение и поместите его в изображение. Я начал использовать Python, как я слышал о Python Imaging Library (она хорошо работает для моего использования), и программирование на JavaScript было бы слишком утомительным.

Итак, мой код:

#!/usr/bin/env python3
from PIL import Image
import os

main_dir = "/Users/dragonsruleethanslota/Downloads/image_averaging_python3.6"
image_dir = f"{main_dir}/images"
image_list = []
invisibles = [".DS_Store", ".Trashes"]

def reset_temptxt():
    with open(f"{main_dir}/temp.txt", "w") as temptxt:
        temptxt.write("")

def check_extensions(countq = False):
    count = 0
    for filename in os.listdir(image_dir): # Problematic lines of code
        if filename in invisibles:         # Also problematic
            continue                       # Also problematic
        try:
            Image.open(f"{image_dir}/{filename}")
        except OSError:
            count = count + 1
    if countq:
        return count # Returns amount of bad file extensions
    else:
        return not count # Returns boolean of whether there are bad file extensions or not

if check_extensions():
    for file in os.listdir(image_dir):
        if filename in invisibles:
            continue
        image = Image.open(f"{image_dir}/{file}")
        image_list.append([image, image.load()])

reset_temptxt()

def do_averages(xpixel, ypixel):
    with open(f"{main_dir}/temp.txt", "a") as temptxt:
       for (img, pixel_img) in image_list:
           pixel = pixel_img[xpixel, ypixel]
           temptxt.write("{},{},{}".format(*pixel))

do_averages(0, 0)

(у меня также есть файл с именем temp.txt и папка с именем images)

Что чрезвычайно запутало все это, когда я вернулся на ночь, чтобы запустить его снова: Я пошел и закончил программировать функцию do_averages(), затем запустил ее в ожидании увидеть что-то в temp.txt, но ничего не получилось. Это произошло из-за сбоя функции check_extensions(), поскольку macOS добавляет файл с именем «.DS_Store» в папки. Это вызвало сбой функции; Я добавил список invisibles и проверил, был ли текущий файл в каком-либо из этих файлов. Если так, тогда пропустите остальную часть кода.

Однако эта новая строка вызывает ошибку! Очевидно, Python не может найти переменную filename (ту, которая присваивается l oop). И что еще больше сбивает с толку, так это то, что когда я снимаю чек, ошибка не возникает. Пожалуйста помоги; Я новичок в Python и чувствую, что это забывчивая ошибка!

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Проблема здесь:

if check_extensions():
    for file in os.listdir(image_dir):
        if filename in invisibles:
            continue

Вы пытаетесь получить доступ к filename, но переменная, которую вы используете в вашем l oop, равна file. Измените его на:

if check_extensions():
    for file in os.listdir(image_dir):
        if file in invisibles:
            continue
0 голосов
/ 18 апреля 2020

Проблема не в том месте, где вы думаете ... Посмотрите на вашу вторую функцию check_extensions:

if check_extensions():
    for file in os.listdir(image_dir):
        if filename in invisibles:
            continue
        image = Image.open(f"{image_dir}/{file}")
        image_list.append([image, image.load()])

ЗДЕСЬ: она не может найти имя файла ... Потому что вы сказали "для файла в" , а затем спросил имя файла !!! Решите, используйте либо:

if check_extensions():
    for filename in os.listdir(image_dir):
        if filename in invisibles:
            continue
        image = Image.open(f"{image_dir}/{file}")
        image_list.append([image, image.load()])

, либо:

if check_extensions():
    for file in os.listdir(image_dir):
        if file in invisibles:
            continue
        image = Image.open(f"{image_dir}/{file}")
        image_list.append([image, image.load()])
...