Wie finde ich heraus ob die Liste leer ist?

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
Tayce
User
Beiträge: 56
Registriert: Sonntag 22. April 2007, 18:26
Wohnort: München
Kontaktdaten:

Montag 13. August 2007, 20:30

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()
Jabber: tayce@jaim.at
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 13. August 2007, 20:37

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!
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Tayce
User
Beiträge: 56
Registriert: Sonntag 22. April 2007, 18:26
Wohnort: München
Kontaktdaten:

Montag 13. August 2007, 20:39

Danke! :D
Jabber: tayce@jaim.at
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 13. August 2007, 20:44

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).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Tayce
User
Beiträge: 56
Registriert: Sonntag 22. April 2007, 18:26
Wohnort: München
Kontaktdaten:

Montag 13. August 2007, 20:59

^^ auf

Code: Alles auswählen

if liste ==[]
hätt ich auch kömmen können :lol:
Jabber: tayce@jaim.at
Tayce
User
Beiträge: 56
Registriert: Sonntag 22. April 2007, 18:26
Wohnort: München
Kontaktdaten:

Montag 13. August 2007, 21:45

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()
Jabber: tayce@jaim.at
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Dienstag 14. August 2007, 00:48

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.)
Tayce
User
Beiträge: 56
Registriert: Sonntag 22. April 2007, 18:26
Wohnort: München
Kontaktdaten:

Dienstag 14. August 2007, 02:17

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
Jabber: tayce@jaim.at
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Dienstag 14. August 2007, 11:52

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."
BlackJack

Dienstag 14. August 2007, 12:32

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()
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 14. August 2007, 14:36

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.
Antworten