Seite 1 von 1

Wie finde ich heraus ob die Liste leer ist?

Verfasst: Montag 13. August 2007, 20:30
von Tayce
Hallo,

da ich mich endlich aufgerappelt hab mein Skript das mehrere Bilder skaliert zu überarbeiten bin ich auf ein Problem gestoßen.

Wie ihr unten seht wird abgefragt ob jpgs pngs und gifs im Ordner sind in dem auch das Skript ist. Darunter werden die Listen jpg png und gif zu einer Liste "alle" verschmolzen. Jetz möchte ich aber das wenn in der Liste "alle" nicht vorhanden ist das dass Skript abbricht.

Ich hab mir gedacht das ich das ganze einer while Schleife unterziehe und dann break anwende aber mir fällt im Moment nicht ein wie ich herrausfinde ob eine Liste leer ist :oops:

Code: Alles auswählen

#!/usr/bin/env python
#!-*- coding: utf-8 -*-

import os
from PIL import Image

def main():
    jpg = [j for j in os.listdir(".") if j.lower().endswith(".jpg")]
    png = [p for p in os.listdir(".") if p.lower().endswith(".png")]
    gif = [g for g in os.listdir(".") if g.lower().endswith(".gif")]
    
    alle = jpg+png+gif 
    
    print alle
    
    x = int(input("Menge der Pixel für x (z.B. 1024) --> "))
    y = int(input("Menge der Pixel für y (z.B. 768) --> "))
    
    for i in alle:
        print "bearbeite", i
        im = Image.open(i)
        im_resized = im.resize((x,y))
        im_resized.save(i)
        print i, "bearbeitet\n"

if __name__ == "__main__":
    main()

Verfasst: Montag 13. August 2007, 20:37
von Leonidas
Leere Listen sind per definition False:

Code: Alles auswählen

In [25]: liste = list()
In [26]: if not liste:
   ....:     print 'Liste ist leer!'
   ....:
Liste ist leer!

Verfasst: Montag 13. August 2007, 20:39
von Tayce
Danke! :D

Verfasst: Montag 13. August 2007, 20:44
von Leonidas
Andere Möglichkeiten:

Code: Alles auswählen

In [27]: if liste == []: print 'Liste ist leer!'
   ....:
Liste ist leer!
In [28]: if len(liste) == 0: print 'Liste ist leer'
   ....:
Liste ist leer
In [29]: if not len(liste): print 'Liste ist leer'
   ....:
Liste ist leer
Aber der direkte Weg über den Wahrheitswert einer Liste ist zu bevorzugen, weil der auch mit anderen Objekten als Listen zurechtkommt. Aber gut zu wissen dass es auch anders geht (die Länge null ist übrigens auch unwahr).

Verfasst: Montag 13. August 2007, 20:59
von Tayce
^^ auf

Code: Alles auswählen

if liste ==[]
hätt ich auch kömmen können :lol:

Verfasst: Montag 13. August 2007, 21:45
von Tayce
So ich bin jetz fertig mit dem Skript. (glaub ich^^)

Code: Alles auswählen

#!/usr/bin/env python
#!-*- coding: utf-8 -*-

import os
from PIL import Image
def main():
    while True:
        jpg = [j for j in os.listdir(".") if j.lower().endswith(".jpg")]
        png = [p for p in os.listdir(".") if p.lower().endswith(".png")]
        gif = [g for g in os.listdir(".") if g.lower().endswith(".gif")]
    
        alle = jpg+png+gif
        print "Bilder: ", alle
        if alle == []:
            print "Es befinden sich keine Bilder im Ordner!"
            break  
        print alle
        while True:
            try:
                x = int(input("Menge der Pixel für x (z.B. 1024) --> "))
            except:
                print "Bitte geben sie eine Zahl ein"
            else:
                break
        while True:
            try:
                y = int(input("Menge der Pixel für y (z.B. 768) --> "))
            except:
                print "Bitte geben sie eine Zahl ein"
            else:
                break
                
        for i in alle:
            print "bearbeite", i
            im = Image.open(i)
            im_resized = im.resize((x,y))
            im_resized.save(i)
            print i, "bearbeitet\n"
    
        return False
if __name__ == "__main__":
    main()

Verfasst: Dienstag 14. August 2007, 00:48
von BlackVivi
Die Idee ist gut, aber ich hab noch ein paar Vorschläge...

1. Ich glaube die "Hauptschleife" ist unnötig.
2. Du könntest mit Kommandozeilenparameter arbeiten, sowas spart immer Zeit und du könntest vllt leichter damit arbeiten.

Ich hab' mal ein bissel dran rumgespielt, weil ich's nützlich finde und deswegen...:

Code: Alles auswählen

#!/usr/bin/env python
#!-*- coding: utf-8 -*-
import os
import sys
from PIL import Image

def main():
    files = [j for j in os.listdir(".") if j.lower().endswith(".jpg")
             or j.lower().endswith(".gif") or j.lower().endswith(".gif")]
    try:
        for i in files:
            im = Image.open(i)
            im_resized = im.resize((int(sys.argv[1]),int(sys.argv[2])))
            im_resized.save(i)
            print i, "bearbeitet"
    except:
        print "Fehler beim Bearbeiten."
        quit()
        
    print len(files), "Dateien bearbeitet!"

if __name__ == "__main__":
    main()
(Ich lerne selbst noch und will nich sagen, das's so viel besser ist... Nur meiner Erfahrung nach ist sowas leichter zu bearbeiten.)

Verfasst: Dienstag 14. August 2007, 02:17
von Tayce
Hey, du brauchst dich nicht dafür zu entschuldigen^^

Ich bin dir sogar dankbar, du hast den Code um gute 20 Zeilen gekürzt. (Ich habe mir vorgenommen so gut wie es geht nach dem KISS Prinzip zu arbeiten. (Keep it small and simple))
Ich schaue mir gerne die Methoden anderer an, so kommt man auf neue Wege usw...

Das mit den Kommandozeilen Parametern finde ich auch gut. Nur wusste ich nicht wie das geht und meine "Python-Gepackt" Referenz hab ich grad nich gefunden :D

Verfasst: Dienstag 14. August 2007, 11:52
von mkesper
BlackVivi hat geschrieben:

Code: Alles auswählen

    try:
        ...
    except:
        print "Fehler beim Bearbeiten."
        quit()
Ich fände Folgendes sprechender:

Code: Alles auswählen

    try:
        ...
    except:
        print "Fehler beim Bearbeiten."
        raise
        
Das andere liefert nämlich nur eine Meldung à la "Es ist ein unerwarteter Fehler aufgetreten."

Verfasst: Dienstag 14. August 2007, 12:32
von BlackJack
Noch eine Alternative (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
import os
import sys
from functools import partial
from itertools import ifilter
from PIL import Image


def endswith(ends, string):
    return any(string.lower().endswith(end) for end in ends)


def main():
    try:
        size = (int(sys.argv[1]), int(sys.argv[2]))
    except ValueError:
        sys.exit('Breite und Hoehe muessen ganze Zahlen sein.')
    except IndexError:
        sys.exit('Breite und Hoehe muessen als Argumente uebergeben werden.')
    
    is_graphic = partial(endswith, ('.jpg', '.gif', '.png'))
    
    for i, filename in enumerate(ifilter(is_graphic, os.listdir('.'))):
        Image.open(filename).resize(size).save(filename)
        print filename, 'bearbeitet.'
    
    try:
        print i + 1,
    except NameError:
        print 'Keine',
    print 'Dateien bearbeitet.'


if __name__ == '__main__':
    main()

Verfasst: Dienstag 14. August 2007, 14:36
von Y0Gi
Ich habe mir kürzlich ein Progrämmchen zur Erzeugung einer statische Web-Galerie gebastelt: Gallerize
Enthalten ist u.a. ein `resize`-Script, für das ich (wie mittlerweile eigentlich fast überall) den OptionParser aus dem `optparse`-Modul verwende.