Sep-24-2020, 09:07 PM
Hi,
I'm currently starting to learn python (have already programming experience with c#).
For my first project i wanted to write a script, that sorts my camera images. The idea is to create a task list, that contains a list of image file paths, that either have or don't have exif tags.
For the first part, i have written a class, that creates a csv file with the file path and a boolean flag (has exif or not). Somehow i'm not able to successfully execute my method called 'create_tasklist'. I'm getting an error, that another method 'get_filtered_images' in that class cannot be found.
From my point of view it looks good, but still i'm getting this error. Can you take a look at the following class?:
Do you have an idea, what could be wrong?
Thanks in advance,
Michael
I'm currently starting to learn python (have already programming experience with c#).
For my first project i wanted to write a script, that sorts my camera images. The idea is to create a task list, that contains a list of image file paths, that either have or don't have exif tags.
For the first part, i have written a class, that creates a csv file with the file path and a boolean flag (has exif or not). Somehow i'm not able to successfully execute my method called 'create_tasklist'. I'm getting an error, that another method 'get_filtered_images' in that class cannot be found.
From my point of view it looks good, but still i'm getting this error. Can you take a look at the following class?:
from os import listdir, path, rename
import csv
import exifread
import datetime
from Settings import Settings
class TaskGenerator:
def __init__(self, settings: Settings):
self.settings = settings
def get_task_line(self, img, image):
tags = exifread.process_file(img)
if tags:
line = image + ";True"
else:
line = image + ";False"
return line
def import_exif_images(self, taskfile_relpath):
isExif = "True"
return import_taskfile(taskfile_relpath, isExif)
def import_nonexif_images(self, taskfile_relpath):
isExif = "False"
return import_taskfile(taskfile_relpath, isExif)
def import_taskfile(self, taskfile_relpath, isExifValue):
current_base_path = path.dirname(path.abspath(__file__))
taskfile_abspath = path.join(current_base_path, taskfile_relpath)
images = []
with open(taskfile_abspath, "r") as tasklist:
csv_reader = csv.reader(tasklist, delimiter=';')
# skip header line
next(csv_reader)
for line in csv_reader:
if not line or len(line) < 2:
continue # skip line if empty
image_path = line[0]
isExif = str(line[1].strip('\''))
if isExif == isExifValue:
images.append(image_path.strip())
return images
def get_filtered_images(self):
files = listdir(self.settings.base_path)
images = []
for file in files:
abspath = path.join(self.settings.base_path, file)
extension_array = path.splitext(abspath)
extension = ""
if extension_array and len(extension_array) > 0:
extension = extension_array[1]
if extension != "" and extension in self.settings.image_types:
images.append(abspath)
return images
def create_tasklist(self, tasklist_filename):
images = get_filtered_images(self)
numberOfImages = len(images)
taskfile_content = ["file;hasexif"]
for image in images:
with open(image, "rb") as img:
imageIndex = images.index(image, 0, numberOfImages)
print("processing image " + str(imageIndex) + "/" + str(numberOfImages) + "(" + image + ")")
line = get_task_line(self, img, image)
taskfile_content.append(line)
current_base_path = path.dirname(path.abspath(__file__))
taskfile_abspath = path.join(current_base_path, tasklist_filename)
with open(taskfile_abspath, "w") as taskfile:
print("writing task file: " + taskfile_abspath)
taskfile_content = "\n".join(taskfile_content)
taskfile.write(taskfile_content)This is how i instantiate the class, and call the method:from TaskGenerator import TaskGenerator
from Settings import Settings
base_path = r"C:\path\to\my\pictures"
copy_only = False
datetime_format_string = "%Y-%m-%d_%H-%M-%S"
exif_tag_name = "EXIF DateTimeOriginal"
image_types = [".jpg", ".png", ".JPG", ".PNG"]
settings = Settings(base_path, copy_only, datetime_format_string, exif_tag_name, image_types)
taskGenerator = TaskGenerator(settings)
taskGenerator.create_tasklist("task-list.csv")Thats the error I'm getting:Error:Exception has occurred: NameError
name 'get_filtered_images' is not defined
File "D:\python-stuff\exifreader\TaskGenerator.py", line 67, in create_tasklist
images = get_filtered_images(self)
File "D:\python-stuff\exifreader\do-work.py", line 14, in <module>
taskGenerator.create_tasklist("task-list.csv")I'm not sure if i made an indentation error, therefore i posted the whole class. Otherwise I'd posted an simplified example.Do you have an idea, what could be wrong?
Thanks in advance,
Michael
