Invalid Syntax, wieso?

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
Hilfeman88
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 15:33

Hallo Leute,

in meinem Code, bei dem ich ein Bild in $-Zeichen umwandeln möchte, gab es eine invalide Syntax, hier ist der Code

Code: Alles auswählen

interval0 = [0, 70]
interval1 = [71, 140]
interval2 = [141, 190]
interval3 = [191, 255]


dollarPixels = ["   ", " $ ", "$ $", "$$$"]
count = 0

with open(donald.jpg",) as Image:
  for pixel in Image.getPixels():
    if pixel >= interval0[0] and pixel <= interval0[1]:
      print(dollarPixels[0]) 
    if pixel >= interval1[0] and pixel <= interval1[1]:
      print(dollarPixels[1]) 
    if pixel >= interval2[0] and pixel <= interval2[1]:
      print(dollarPixels[2])
    if pixel >= interval3[0] and pixel <= interval3[1]:
      print(dollarPixels[3])

    if count <= Image.getWidth():
      count++
    else:
      print("\n") 
      count=0 
      
Ich hoffe ich habe nur etwas übersehen, und nicht gleich alles falsch gemacht, hoffe auf eine schnelle Antwort

LG
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte auch die vollständige Fehlermeldung posten. Nicht nur etwas aus dem Gedächtnis.

Sonst muss man raten. Das geht hier noch so gerade, aber wird einfacher mit der Fehlermeldung. Dein String an open fehlt ein Anführungszeichen.
Hilfeman88
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 15:33

__deets__ hat geschrieben: Mittwoch 20. Oktober 2021, 15:42 Bitte auch die vollständige Fehlermeldung posten. Nicht nur etwas aus dem Gedächtnis.

Sonst muss man raten. Das geht hier noch so gerade, aber wird einfacher mit der Fehlermeldung. Dein String an open fehlt ein Anführungszeichen.
Es geht immernoch nicht
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Was genau hast du an dem Hinweis nicht verstanden, dass wir den Code, der nicht funktioniert, zusammen mit der vollständigen Fehlermeldung benötigen?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nein, natürlich geht das noch immer nicht, weil `open()` ein allgemeines Dateiobjekt liefert, und die haben keine `getPixels()`-Methode.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Beziehungsweise ist ``count++`` natürlich auch noch ein Syntaxfehler den man beheben müsste.

Dann halten sich die Namenschreibweisen nicht an die Konventionen: Style Guide for Python Code.

Nummerierte Namen sind ein „code smell“. Die Intervalle werden der Reihe nach abgearbeitet — die sollten also in einer Liste stehen und dann wo sie verwendet werden eine Schleife, statt da vier mal den im Grunde gleichen Code zu kopieren.

Es wäre sicherer wenn man den Fall, dass ein Pixelwert in keines der Intervalle fällt, nicht einfach geräuschlos ignorieren würde.

`count` kann/sollte man über `enumerate()` erzeugen und dann die Ausgabe eines Zeilenendezeichens über die Teilbarkeit durch die Bildbreite lösen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3


def open_image(filename):
    ...


def main():
    intervals = [[0, 70], [71, 140], [141, 190], [191, 255]]
    dollar_pixels = ["   ", " $ ", "$ $", "$$$"]
    assert len(intervals) == len(dollar_pixels)

    with open_image("donald.jpg") as image:
        for count, pixel in enumerate(image.get_pixels()):
            for (lower_limit, upper_limit), dollar_pixel in zip(
                intervals, dollar_pixels
            ):
                if lower_limit <= pixel <= upper_limit:
                    print(dollar_pixel)
                    break
            else:
                raise ValueError(f"pixel {pixel!r} not in any interval")

            if count and count % image.get_width() == 0:
                print("\n")


if __name__ == "__main__":
    main()
Ich bin mir auch nicht ganz sicher, ob bei ``print(dollar_pixel)`` nicht noch was fehlt und bei ``print("\n")`` nicht eventuell etwas zu viel ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hilfeman88
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 15:33

__blackjack__ hat geschrieben: Mittwoch 20. Oktober 2021, 16:28 Beziehungsweise ist ``count++`` natürlich auch noch ein Syntaxfehler den man beheben müsste.

Dann halten sich die Namenschreibweisen nicht an die Konventionen: Style Guide for Python Code.

Nummerierte Namen sind ein „code smell“. Die Intervalle werden der Reihe nach abgearbeitet — die sollten also in einer Liste stehen und dann wo sie verwendet werden eine Schleife, statt da vier mal den im Grunde gleichen Code zu kopieren.

Es wäre sicherer wenn man den Fall, dass ein Pixelwert in keines der Intervalle fällt, nicht einfach geräuschlos ignorieren würde.

`count` kann/sollte man über `enumerate()` erzeugen und dann die Ausgabe eines Zeilenendezeichens über die Teilbarkeit durch die Bildbreite lösen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3


def open_image(filename):
    ...


def main():
    intervals = [[0, 70], [71, 140], [141, 190], [191, 255]]
    dollar_pixels = ["   ", " $ ", "$ $", "$$$"]
    assert len(intervals) == len(dollar_pixels)

    with open_image("donald.jpg") as image:
        for count, pixel in enumerate(image.get_pixels()):
            for (lower_limit, upper_limit), dollar_pixel in zip(
                intervals, dollar_pixels
            ):
                if lower_limit <= pixel <= upper_limit:
                    print(dollar_pixel)
                    break
            else:
                raise ValueError(f"pixel {pixel!r} not in any interval")

            if count and count % image.get_width() == 0:
                print("\n")


if __name__ == "__main__":
    main()
Ich bin mir auch nicht ganz sicher, ob bei ``print(dollar_pixel)`` nicht noch was fehlt und bei ``print("\n")`` nicht eventuell etwas zu viel ist.
Ok, das ist die komplette Fehlermeldung, die jetzt kommt:

Microsoft Windows [Version 10.0.19043.1237]
(c) Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\User\AppData\Local\Programs\Algoritmika\vscode\data\extensions\algoritmika.algopython-20211015.95910.0\temp>C:/Users/User/AppData/Local/Programs/Algoritmika/algovenv/Scripts/activate.bat

(algovenv) C:\Users\User\AppData\Local\Programs\Algoritmika\vscode\data\extensions\algoritmika.algopython-20211015.95910.0\temp>cd "c:/Users/User/OneDrive/Desktop/folder1"

(algovenv) c:\Users\User\OneDrive\Desktop\folder1>C:/Users/User/AppData/Local/Programs/Algoritmika/algovenv/Scripts/python.exe "c:/Users/User/OneDrive/Desktop/folder1/donald.py"
Traceback (most recent call last):
File "c:/Users/User/OneDrive/Desktop/folder1/donald.py", line 29, in <module>
main()
File "c:/Users/User/OneDrive/Desktop/folder1/donald.py", line 13, in main
with open_image("donald.jpg",) as image:
AttributeError: __enter__

(algovenv) c:\Users\User\OneDrive\Desktop\folder1>

Ich habe einfach mal das kopiert, was du gecodet hast, aber es kommt immernoch eine Fehlermeldung
Benutzeravatar
Dennis89
User
Beiträge: 1154
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

schau mal in die besagte Zeile 13, die dort aufgerufene Funktion enthält nur drei Punkte. Die kann so also nicht mit 'with' verwenden. Du wirst den Code noch weiter schreiben müssen.



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

@Hilfeman88: neben den Syntaxfehlern benutzt Du in Deinem Code auch Methoden, die nicht existieren. Deshalb hat __blackjack__ das Laden des Bildes ausgelassen und nur drei Punkte gesetzt.

Welches Modul verwendest Du denn zum Lesen von Bilder?
Hilfeman88
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 15:33

Sirius3 hat geschrieben: Donnerstag 21. Oktober 2021, 07:19 @Hilfeman88: neben den Syntaxfehlern benutzt Du in Deinem Code auch Methoden, die nicht existieren. Deshalb hat __blackjack__ das Laden des Bildes ausgelassen und nur drei Punkte gesetzt.

Welches Modul verwendest Du denn zum Lesen von Bilder?
Ich denke daran ist es gescheitert, ich habe kein Modul dazu gefunden
Benutzeravatar
Dennis89
User
Beiträge: 1154
Registriert: Freitag 11. Dezember 2020, 15:13

Schau dich doch mal danach um, vielleicht ist das was für dich?
https://pillow.readthedocs.io/en/stable ... Image.html

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Hilfeman88
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 15:33

Dennis89 hat geschrieben: Donnerstag 21. Oktober 2021, 16:25 Schau dich doch mal danach um, vielleicht ist das was für dich?
https://pillow.readthedocs.io/en/stable ... Image.html

Grüße
Dennis
Hilfeman88
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 15:33

Dennis89 hat geschrieben: Mittwoch 20. Oktober 2021, 21:52 Hallo,

schau mal in die besagte Zeile 13, die dort aufgerufene Funktion enthält nur drei Punkte. Die kann so also nicht mit 'with' verwenden. Du wirst den Code noch weiter schreiben müssen.



Grüße
Dennis
Aber was muss ich denn da noch schreiben. Ich kenne mich nicht so gut mit Funktionen aus, Ich habe jetzt zumindest ein Modul zum lesen von Bildern gefunden. Das PIL-Modul. Aber was ich jetzt bei def open_image(filename) schreiben sollte weiß ich nicht so ganz genau. Was mir jetzt so spontan einfallen würde, wäre : return image. Ich hoffe auf eine korrektur deinerseits.

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

Wenn du Probleme mit Funktionen hast, dann solltest du mal folgendes durcharbeiten:
https://docs.python.org/3/tutorial/

Hilfeman88 hat geschrieben: Freitag 22. Oktober 2021, 15:38 Ich hoffe auf eine korrektur deinerseits.
Naja was heißt Korrektur, ich habe mal 'PIL.Image' in __blackjack__'s Code eingefügt. Aber ob dir das was bringt bezweifle ich. Es sind sicherlich noch Anpassungen notwendig und dazu solltest du verstehen, was der Code macht.

Code: Alles auswählen

#!/usr/bin/env python3

from PIL import Image


def main():
    intervals = [[0, 70], [71, 140], [141, 190], [191, 255]]
    dollar_pixels = ["   ", " $ ", "$ $", "$$$"]
    assert len(intervals) == len(dollar_pixels)

    with Image.open("Donald.jpg") as image:
        for count, pixel in enumerate(image.getpixel((300, 300))):
            for (lower_limit, upper_limit), dollar_pixel in zip(
                intervals, dollar_pixels
            ):
                if lower_limit <= pixel <= upper_limit:
                    print(dollar_pixel)
                    break
            else:
                raise ValueError(f"pixel {pixel!r} not in any interval")
            if count and count % image.width == 0:
                print("\n")


if __name__ == "__main__":
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Hilfeman88
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 15:33

Dennis89 hat geschrieben: Donnerstag 21. Oktober 2021, 16:25 Schau dich doch mal danach um, vielleicht ist das was für dich?
https://pillow.readthedocs.io/en/stable ... Image.html

Grüße
Dennis
Hi Dennis, ich wollte mich für deine Hilfe bedanken, deine Tiopps waren bisher die besten, ich habe jetzt einen veränderten Code und habe das Modul PIL als leser der Bilder. Es gibt nur noch einnen kleinen Fehler, der behoben werden muss. Das ist mein neuer Code:
from PIL import image

def open_image(filename):
return image
def main():
intervals = [[0, 70], [71, 140], [141, 190], [191, 255]]
dollar_pixels = [" ", " $ ", "$ $", "$$$"]
assert len(intervals) == len(dollar_pixels)
with open_image("donald.jpg") as image:
for count, pixel in enumerate(image.get_pixels()):
for (lower_limit, upper_limit), dollar_pixel in zip(intervals, dollar_pixels):
if lower_limit <= pixel <= upper_limit:
print(dollar_pixel)
break
else:
raise ValueError(f"pixel {pixel!r} not in any interval")
if count and count % image.get_width() == 0:
print("\n")
if __name__ == "__main__":
main()

Der klappt, außer, dass es image nicht erkennt, hier die Fehlermeldung:
Microsoft Windows [Version 10.0.19043.1237]
(c) Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\User\AppData\Local\Programs\Algoritmika\vscode\data\extensions\algoritmika.algopython-20211015.95910.0\temp>C:/Users/User/AppData/Local/Programs/Algoritmika/algovenv/Scripts/activate.bat

(algovenv) C:\Users\User\AppData\Local\Programs\Algoritmika\vscode\data\extensions\algoritmika.algopython-20211015.95910.0\temp>cd c:/Users/User/OneDrive/Dokumente/Soundaufnahmen

(algovenv) c:\Users\User\OneDrive\Dokumente\Soundaufnahmen>C:/Users/User/AppData/Local/Programs/Algoritmika/algovenv/Scripts/python.exe c:/Users/User/OneDrive/Dokumente/Soundaufnahmen/test.py
Traceback (most recent call last):
File "c:/Users/User/OneDrive/Dokumente/Soundaufnahmen/test.py", line 1, in <module>
from PIL import image
ImportError: cannot import name 'image' from 'PIL' (C:\Users\User\AppData\Local\Programs\Algoritmika\algovenv\lib\site-packages\PIL\__init__.py)

(algovenv) c:\Users\User\OneDrive\Dokumente\Soundaufnahmen>

Eigentlich sollte es ja Image erkennen, weil image schon drinne ist, hoffe du kennst die Antwort
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hilfeman88: Gross-/Kleinschreibung beachten. `image` ist was anderes als `Image`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten