Seite 1 von 1

Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 15:38
von Hilfeman88
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

Re: Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 15:42
von __deets__
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.

Re: Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 15:49
von Hilfeman88
__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

Re: Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 16:02
von sparrow
Was genau hast du an dem Hinweis nicht verstanden, dass wir den Code, der nicht funktioniert, zusammen mit der vollständigen Fehlermeldung benötigen?

Re: Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 16:10
von __blackjack__
Nein, natürlich geht das noch immer nicht, weil `open()` ein allgemeines Dateiobjekt liefert, und die haben keine `getPixels()`-Methode.

Re: Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 16:28
von __blackjack__
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.

Re: Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 20:44
von Hilfeman88
__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

Re: Invalid Syntax, wieso?

Verfasst: Mittwoch 20. Oktober 2021, 21:52
von Dennis89
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

Re: Invalid Syntax, wieso?

Verfasst: Donnerstag 21. Oktober 2021, 07:19
von Sirius3
@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?

Re: Invalid Syntax, wieso?

Verfasst: Donnerstag 21. Oktober 2021, 16:09
von Hilfeman88
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

Re: Invalid Syntax, wieso?

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

Grüße
Dennis

Re: Invalid Syntax, wieso?

Verfasst: Freitag 22. Oktober 2021, 15:33
von Hilfeman88
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

Re: Invalid Syntax, wieso?

Verfasst: Freitag 22. Oktober 2021, 15:38
von Hilfeman88
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

Re: Invalid Syntax, wieso?

Verfasst: Freitag 22. Oktober 2021, 20:08
von Dennis89
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

Re: Invalid Syntax, wieso?

Verfasst: Freitag 22. Oktober 2021, 22:04
von Hilfeman88
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

Re: Invalid Syntax, wieso?

Verfasst: Freitag 22. Oktober 2021, 23:12
von __blackjack__
@Hilfeman88: Gross-/Kleinschreibung beachten. `image` ist was anderes als `Image`.