Syntaxfehler bei except

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
canis42
User
Beiträge: 9
Registriert: Donnerstag 8. August 2024, 18:00

Ich arbeite mit Python 3.12.3 unter Linux Mint

Da es mit dem exiftool nicht funktioniert hat aus *.dng Dateien den Wert des exif-Feldes Headline in die xmp-Datei als Title hinein zu schreiben. wollte ich das jetzt mit einem Python-Programm versuchen. Dabei kommt jetzt das:

Code: Alles auswählen

 File "/home/mario/Develop/eclipse-workspace/Darktable/DTFunctions.py", line 23
    except as err:
           ^^
SyntaxError: invalid syntax
Ich kämpfe schon den ganzen Tag mit unverständlichen Syntaxfehlermeldungen. Was soll nun hier am Wörtchen "as" falsch sein?

Code: Alles auswählen

import os
import piexif
from os import listdir
from os.path import isfile, join
import PIL
import sys
from PIL import Image
class DTFunctions:
    def convertValue2Xmp(self, folderPath, sourceItem, destItem):
        items = listdir(folderPath)
        dirlist = []
        exifListPic = ""
        exifListXmp = ""
        for item in items:
            ext = os.path.splitext(item)
            if(item.isfile(item) and ext != ".xmp"):
                picFilePath = folderPath.join("/" + item);
                try:
                    imagePic = PIL.Image.open(picFilePath)
                    exifListPic = piexif.load(imagePic.info['exif'])
                except FileNotFoundError:
                    sys.stderr.print("***File not found ***")
                except as err:
                    sys.stderr.print("*** Unexpected error ***", err)
                else:
                    xmpFilePath = picFilePath.join(".xmp")
                    try:
                        imageXmp = PIL.Image.open(xmpFilePath)
                        exifListXmp = piexif.load(imageXmp.info['exif'])
                    except as e:
                            sys.stderr.print(("*** Unexpected error at " + xmpFilePath + ": ", e)
                    else
                        try:
                            sourceValue = exifListPic[sourceItem]
                            destValue = exifListXmp[destItem]
                            if(destValue == "" && sourceValue != "")
                            exifListXmp[destItem] = sourceValue
                            exifDataXmp = piexif.dump(exifListXmp)
                            image.save('_%s' % filename, "dng", exif=exifDataXmp)
                        except as e:
                            sys.stderr.print(("*** Unexpected error ", e)
            elif isdir(item) || islink(item):
                dirlist.append(item)
            for item in dirlist:
                convertValue2Xmp(folderPath+"/"+item)

    def ListAll (self, pFolder):
        try:
            for filename in listdir(pFolder):
                basename, ext = os.path.splitext(filename)
                if filename == 'ae0002.dng':
                    print("***** ",filename," *****")
                    img = PIL.Image.open(Folder + "/" + filename)
                    exifData = img.getexif().items()
                    for key, value in exifData:
                        print(hex(key), value)
        except as e:
            sys.stderr.print("Unexpected error occured:", e)

Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

welche Ausnahme willst du behandeln?
Die musst du nach `except` angeben, so wie du es zum Beispiel mit `FileNotFoundError` gemacht hast.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Programme entwickelt man Stück für Stück, in dem man kurze Funktionen schreibt, die man gründlich testet, bevor man weitermacht. Du hast hier 60 Zeilen, die nicht einmal am Compiler vorbeikommen.
Zudem hast Du viele Funktionen erfunden, weil die für Dich passend wären. Aber man kann nur mit existierenden Funktionen arbeiten.

item.isfile existiert nicht, ebenso wenig folderPath.join, oder sys.stderr.print.
Die Operatoren || und && existieren auch nicht.
Bei einem if fehlt der Doppelpunkt und der Code-Block danach.

Variablennamen und Funktionen schreibt man generell komplett klein.
Die Funktionen aus `os` benutzt man nicht mehr, statt dessen benutzt man pathlib.Path.
Wenn eine Klasse keinen Zustand hat und keine Methode darin `self` benutzt, dann hat man keine Klasse. Das sind einfache Funktionen.
exifListPic und exifListXmp werden mal an einen String und mal an ein Wörterbuch gebunden, das darf nicht sein, weil das zu schwer zu findenden Fehlern führt.
Sowohl Strings per + zusammenzusetzen, oder mit % zu formatieren wurde durch f-Strings ersetzt.

Um Verzeichnisse und Unterverzeichnisse zu durchsuchen, gibt es pathlib.Path.rglob.
Du scheinst zu jedem Bild eine xmp-Datei zu haben. Da immer beides zusammengehören muß, ist es einfacher alle xmp-Dateien zu suchen.

Völlig ungetestet könnte das alles dann ungefähr so aussehen:

Code: Alles auswählen

from pathlib import Path
import PIL
import piexif

def convert_xmp_file(xmp_path, source_item, destination_item):
    pic_path = xmp.path.with_name(xmp_path.stem)
    if not pic_path.is_file():
        print(f"xmp-file {xmp_path} without image file.")
        return
    image_pic = PIL.Image.open(pic_path)
    exif_pic = piexif.load(image_pic.info['exif'])
    image_xmp = PIL.Image.open(xmp_path)
    exif_xmp = piexif.load(image_xmp.info['exif'])

    source_value = exif_pic[source_item]
    destination_value = exif_xmp[destination_item]
    if not destination_value and source_value:
        exif_xmp[destination_item] = source_value
        image_pic.save(
            pic_path.with_name(f"_{pic_path.name}"),
            format="dng",
            exif=piexif.dump(exif_xmp)
        )


def convert_all_xmp_files(folder_path, source_item, destination_item):
    for xmp_path in Path(folder_path).rglob("*.xmp"):
        convert_xmp_file(xmp_path, source_item, destination_item)
Benutzeravatar
__blackjack__
User
Beiträge: 14000
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Lesestoff: Style Guide for Python Code

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Der Name soll dem Leser vermitteln was der Wert dahinter im Programm bedeutet, nicht zum rätseln zwingen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
canis42
User
Beiträge: 9
Registriert: Donnerstag 8. August 2024, 18:00

Danke für die Hinweise. Ich bin inzwischen selbst darauf gekommen, dass ich "except Exception as e:" schreiben muss um alle noch übrigen Ereignisse abzufangen..

Ich habe halt den Stil benutzt, den ich seit über 40 Jahren in C++, Java und anderen Programmiersprachen benutze. Unterstriche sind für mich eher schwer lesbar und verlängern die Namen zusätzlich. Ich bemühe mich schon Namen sprechend zu wählen. exif und xmp sind für Fotografen keine kryprischen Abürzungen, sondern feststehende Begriffe.

Ich schreibe auch größere Codestücke erst einmal hin und behebe dann die Syntaxfehler. und Debugge den Code dann iteraktiv. Software-Architektur ist für mich Routine.

Eclipse läuft inzwischen ganz gut für mich mit Python, Das tolle Tool bin ich von C++ und Java gewöhnt. Python ist noch etwas ungewohnt für mich, daher mehr Syntaxfehler jetzt zu Anfang. Jedem seine Arbeitsweise.

Gestern stand ich noch vor dem Abgrund, heute bin ich schon wieder einen Schritt weiter ;)
Benutzeravatar
__blackjack__
User
Beiträge: 14000
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@canis42: Um alle übrigen Ausnahmen zu behandeln braucht man erst einmal eine sinnvolle Behandlung *aller* übrigen Ausnahmen. Einfach nur die Ausnahme ausgeben und den Traceback unterschlagen ist nicht sinnvoll. Das erschwert einfach nur die Fehlersuche unnötig.

In Python wird halt ein anderer Stil verwendet. Geh mal in ein Java-Forum und schreib da Namen mit Unterstrichen. Wirst Du garantiert jedes mal drauf hingewiesen.

EXIF und XMP meinte ich nicht, das sind ja in der Tat gängige Abkürzungen bzw. Akronyme. Ich meinte beispielsweise das `DT` in `DTFunctions`, Namen die einfach nur `e` heissen, `piexif` als Name, wo man superleicht was anderes lesen kann als `pi_exif` und sich dann wenn man die richtige Stelle zum Trennen gefunden hat, fragt was die Kreiszahl damit zu tun hat, oder das `p` in `pFolder`.

Deine Arbeitsweise eignet sich IMHO nicht um unfertigen Code öffentlich zu präsentieren. Du rätst Syntax und API und stellst dazu Fragen, was die Leser dann dazu verdonnert raten müssen was Du versuchst hast zu erraten. Das ist nicht wirklich zielführend. Bei Syntaxfehlern meldet der Compiler den ja erst wenn er merkt das etwas nicht stimmt, was bedeutet das der eigentliche Fehler oft irgendwo im Code davor liegt. Wenn der aber voll mit Fehlern ist, dann macht das eher keinen Spass Deinen ganzen Code zu entlausen. Das wird Dir vielleicht ein bis zwei mal jemand machen, und dann hat da keiner mehr Lust drauf die Fleissarbeit für Dich zu erledigen.

Du kannst diese Arbeitsweise ja gerne für Dich machen, aber Du solltest dann nur den syntaktisch korrekten und fehlerbereinigten Teil zeigen, der möglichst nur den einen Fehler enthält um den es geht.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

__blackjack__ hat geschrieben: Sonntag 11. August 2024, 22:43 Du kannst diese Arbeitsweise ja gerne für Dich machen, aber Du solltest dann nur den syntaktisch korrekten und fehlerbereinigten Teil zeigen, der möglichst nur den einen Fehler enthält um den es geht.
Das berühmte minimale Beispiel. Mit dem Zusatznutzen, dass Du dabei manchmal schon selber auf die Lösung stößt oder Deine Fragen jedenfalls genauer formulieren kannst.
Antworten