PIL Problem

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
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

Ich möchte mit ein Script erstellen, um per Python + PIL Bilder in einem Verzeichnis zu konvertieren.
Folgender Code funktioniert auch soweit

Code: Alles auswählen

for files in glob.glob(e):
    file, ext = os.path.splitext(files)
    outfile = file + "." + ausgang
    print outfile
    im=Image.open (files)
    im.save(outfile)       
[/code]

Jetzt möchte ich das Gnaze noch um Bedingung erweitern, PIL ist es egal ob ich eine Bilddatei, doer eine Textdatei als Eingangsformat eingeben, es gibt keine Fehlrrmeldung. deshalb wollte ich per Listenlänge prüfen, ob der Dateitypü im Verzeichnis vorhanden ist, mit folgendem Code

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
from PIL import Image
import glob
os.chdir("/deblivpro/programmieren/python/verztest")
eingang = (raw_input("Bitte jpg, png oder tif eintippen :"))
ausgang = (raw_input("Bitte das Ausgangformat jpg, png oder tif eintippen :"))
e = "*." + eingang
liste = []
for files in glob.glob(e):
    file, ext = os.path.splitext(files)
    liste.append (files)
    outfile = file + "." + ausgang
    print files
    if len(liste) <= 0:
        print "Daten nicht vorhanden"
else: print "Dateien sind vorhanden"
jedoch, wenn ich in der else-Anweisung statt print ..,
im=Image.open (files)
im.save(outfile)

eingebe, kommt eine Fehlerrmeldung.
wieso ?

mfg
schwedenmann
mfg
schwedenmann
BlackJack

@schwedenmann: Wieso sollte eine Fehlermeldung kommen? An der Stelle wo Du prüfst kann die Liste niemals leer sein weil drei Zeilen darüber ja mit `append()` etwas an die Liste angehängt wurde.

Einrückung ist wichtig in Python. Damit wird gekennzeichnet welcher Code zusammengehört, also zum Beispiel was alles zu einem Schleifenkörper oder einem Zweig eines ``if``/``else`` gehört. Du prüfst da gerade etwas *innerhalb* der Schleife was Du eigentlich *danach* tun möchtest.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

schwedenmann hat geschrieben:jedoch, wenn ich in der else-Anweisung statt print ..,
im=Image.open (files)
im.save(outfile)

eingebe, kommt eine Fehlerrmeldung.
wieso ?
Welche Fehlermeldung bekommst du?

Ich würde übrigens auf den einsatz von os.chdir() verzichten.
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo
Wieso sollte eine Fehlermeldung kommen? An der Stelle wo Du prüfst kann die Liste niemals leer sein weil drei Zeilen darüber ja mit `append()` etwas an die Liste angehängt wurde.
Sorry, da hatte ich wohl mißverständlich formuliert.
PIL ist es egal, was man als dateitypen eingibt, entweder es wird konvertiert, oder eben nciht, nur wenn ncith, gibt PIL (nicht mein Codeschnippsel) nichts aus.

meine Länegnüberprüfung der Liset klappt ja auch, nur ich weiß nicht, warum ich bei der else - Anweisung nicht
im=Image.open (files)
im.save(outfile)
einsetzen kann. Da sollte das Programm doch dann weitermachen, wenn die Länge der Liste größer 0 ist.
Das Ganze ist wahrscheinlich ein Einrückungsfehler, nur finde ich den nicht.

Ich möchte einfach den 1. Code um eine Prüffunktion (ob per len einer Liste) ist mir wurscht) erweitern, damit bei Eingavbe von Dateien, die im angegebenen Verzeichnis nciht vorhanden sind, das Programm abbricht, bzw. dem user eine Fehelrmeldung ausgibt. Da habe ich dann als Kriterium, die Länge der Liste genommen.


Fehlermeldung unter geany
File "jiconv4.py", line 21
im.save(outfile)
^
IndentationError: unexpected indent

------------------
(program exited with code: 1)
Press return to continue
bezüglich os.chdir
wie kann ich einfacher ein Verzeichnis angeben, indem das Progarmm ausgeführt wird?
Ich wollte das Script später noch erweiterenm,das das Ausführunsgverzeichnsi vom user explizit ausgewählt werden kann.
mfg
schwedenmann
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vermischt du im else-Abschnitt bei der Einrückung Tabs und Space?
Das Leben ist wie ein Tennisball.
BlackJack

@schwedenmann: Anstelle von `os.chdir()` solltest Du einfach mit absoluten Pfaden arbeiten. Also nicht irgendwo hinwechseln und da `glob()` aufrufen, sondern bei `glob()` (und allen anderen Aktionen die einen Pfad-/Dateinamen benötigen) den kompletten Pfad dorthin übergeben.
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

Code 2 klappt ja
liste = []
for files in glob.glob(e):
file, ext = os.path.splitext(files)
liste.append (files)
outfile = file + "." + ausgang
print files
if len(liste) <= 0:
print "Daten nicht vorhanden"
wenn ich jetzt für eingabedatei jpg u d Auzsgabe tif eintippe kommt folgnedes
Bitte jpg, png oder tif eintippen :jpg
Bitte das Ausgangformat jpg, png oder tif eintippen :tif
In_the_groove.jpg
Ocean.jpg
Implosions.jpg
Dateien sind vorhanden


------------------
(program exited with code: 0)
Press return to continue
ist ok, es gibt nur 3 jpg im Verzeichnis
bei zip + tif kommt folgendes
Bitte jpg, png oder tif eintippen :zip
Bitte das Ausgangformat jpg, png oder tif eintippen :tif
Dateien sind vorhanden


------------------
(program exited with code: 0)
Press return to continue
Ist auch ok, es gibt keine zip im Verzeichnis.
Also funktioniert die Abfage der Länge der Liste ja, wenn ich aber jetzt
else: print "Dateien sind vorhanden"
austausche gegen
im=Image.open (files)
im.save(outfile)
funktioniert die else Anweisung nicht, wieso!

Ich habe nochmal alles kontrolliert, benutze nur Leerzeichen.
mfg
schwedenmann
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mal eine ganz abgefahrene Vermutung: schreibst du noch etwas in der selben Zeile hinter dem "else:"? Evtl. machst du uns es etwas einfacher, wenn du den gesamten Code zeigst und nicht nur beschreibst, wo du was ersetzt hast.

Sebastian
Das Leben ist wie ein Tennisball.
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo


schreibst du noch etwas in der selben Zeile hinter dem "else:"?
nein, da ist das Script, jedenfalls für jetzt zu Ende.
mfg
schwedenmann
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Was zu meinem zweiten Punkt meines letzten Posts führt: zeige den gesamten nicht-lauffähigen Code. Sonst endet das hier hin munterem raten.
Das Leben ist wie ein Tennisball.
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hier jetzt der Code der nciht klappt

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
from PIL import Image
import glob
os.chdir("/deblivpro/programmieren/python/verztest")
eingang = (raw_input("Bitte jpg, png oder tif eintippen :"))
ausgang = (raw_input("Bitte das Ausgangformat jpg, png oder tif eintippen :"))
e = "*." + eingang
liste = []
for files in glob.glob(e):
	file, ext = os.path.splitext(files)
	liste.append (files)
	outfile = file + "." + ausgang
	print files
	if len(liste) <= 0:
		print "Daten nicht vorhanden"
#else: print "Dateien sind vorhanden"
else:im=Image.open (files)
     im.save(outfile)

Die letzten beiden zeilen müssen wohl in die for Schleife, nur weiß ich nciht, wwie ich dann die Länge der Liste abfragen kann und dann bei einer Länge größer 0 sollen die beiden letzten Zeilen dann abgearbeitet werden.
Ich will doch blas alle Dateien einens Typs xyz z.B. jpg nach z.B. png wandeln und fallls keine jpg vorhanden sind, soll das Progrämmchen abgebrechen, respektive es soll eine Fehlermeldung ausgeworfen werden.
mfg
schwedenmann
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ich verstehe zwar nicht was du da versuchts, aber ich würde das Problem anders angehen. Einfach alle Dateiname im Ordner fischen und davon dann ein Generator erstellen der das Kriterium jpg/png/tif als Dateiendung entsprechend filtert.

Code: Alles auswählen

import os

path = "/deblivpro/programmieren/python/verztest"
ending = "jpg"

imagenames = (name for name in os.listdir(path) \
              if os.path.splitext(name)[1] == ending)

for imagename in imagenames:
    # todo
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

schwedenmann hat geschrieben:Hier jetzt der Code der nciht klappt

Code: Alles auswählen

[...]
for files in glob.glob(e):
	file, ext = os.path.splitext(files)
	liste.append (files)
	outfile = file + "." + ausgang
	print files
	if len(liste) <= 0:
		print "Daten nicht vorhanden"
#else: print "Dateien sind vorhanden"
else:im=Image.open (files)
     im.save(outfile)
Oh, oh. Du hast keine wirkliche Vorstellung davon wie das Programm abläuft oder?

Dein else-Zweig bezieht sich aufgrund der Einrückung auf das for und nicht auf das if. Der Code darin wird dann ausgeführt, wenn glob() keine Dateien gefunden hat. Was das für das Image.open() bedeutet kannst du dir sicher vorstellen. Zudem schreibst du Code direkt hinter das else, damit gehört die folgende Zeile nicht mehr zum Block und du müsstest eigentlich einen IndentationError bekommen.

Die Liste ist völlig sinnlos. Du füllst erst Daten hinein und überprüfst dann, ob sie Daten enthält. Unter welchen Umständen erwartest du, dass die Liste dann leer sein soll?

Geh den Ablauf mal von Hand durch und überlege dir, was da eigentlich passiert.
Antworten