Seite 1 von 1

PIL Problem

Verfasst: Dienstag 10. Mai 2011, 07:56
von schwedenmann
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

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 08:13
von 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.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 08:15
von /me
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.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 09:06
von schwedenmann
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.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 09:11
von EyDu
Vermischt du im else-Abschnitt bei der Einrückung Tabs und Space?

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 09:38
von 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.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 09:54
von schwedenmann
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.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 10:08
von EyDu
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

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 10:10
von schwedenmann
Hallo


schreibst du noch etwas in der selben Zeile hinter dem "else:"?
nein, da ist das Script, jedenfalls für jetzt zu Ende.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 10:12
von EyDu
Was zu meinem zweiten Punkt meines letzten Posts führt: zeige den gesamten nicht-lauffähigen Code. Sonst endet das hier hin munterem raten.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 11:08
von schwedenmann
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.

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 11:34
von Xynon1
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

Re: PIL Problem

Verfasst: Dienstag 10. Mai 2011, 15:10
von /me
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.