Bilder downloaden und umbenennen

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.
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

Mittwoch 18. März 2009, 10:17

Hallo,
ich habe eine Datei 'bilder', welche den zukünftigen Bildnamen und eine dazugehörige URL getrennt von einem Trennzeichen (#!) enthält:
Mein Programm soll das Bild, welches die URL angibt herunter laden und das Bild mit dem Namen (vor dem #!) umbenennen. Hier mein Versuch:
[

Code: Alles auswählen

# -*- coding: cp1252 -*-
import pycurl
def speicher_bild(name,url):
    f = open('pics1/%s.jpg' % (name), 'w') # Öffnen einer Datei name.jpg
    c = pycurl.Curl() # Optionen für cURL
    c.setopt(pycurl.URL, url) # Angabe der URL
    c.setopt(pycurl.VERBOSE, 1)
    c.setopt(pycurl.POST, 0)
    c.setopt(c.NOPROGRESS, 0)
    c.setopt(c.FOLLOWLOCATION, 1)
    c.setopt(c.MAXREDIRS, 5)
    c.setopt(c.WRITEDATA, f) # Nach dem Herunterladen in die Datei name.jpg schreiben

    c.perform()
    c.close()
       
    f.seek(0)
    f.close()
    
def name_bild():
    name=''
    url=''
    datei = open('bilder', 'r')
    weiter = True
    while weiter:
        line = datei.readline()
        if len(line) == 0:
            weiter = False
            break
        else:
            a=line.find('#!')
            for i in range (0,a): # Namen auslesen
                name=name+line[i]
            print name
            
            b=line.find('\n')
            for l in range (a+2,b): # URL auslesen
                url=url+line[l]
            print url 
            speicher_bild(name,url) # Namen und URL an speicher_bild() übergeben
            name=''
            url=''

execute=name_bild()
Die Bilddateien werden erstellt, jedoch irgendwie falsch: In diesem Konkreten Beispiel wird ein Bild halb geladen, bei einem wird nur die Datei erstellt und das andere wird zwar beschrieben, ist jedocch scheinbar falsch, da es nicht gelesen werden kann.

Jemand eine Idee, was ich falsch mache? Glaube, dass bei speicher_bild() etwas nicht stimmt. Namen und URL gibt er ja richtig aus!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 18. März 2009, 11:03

Versuch doch erstmal die ``urllib`` statt curl.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 18. März 2009, 11:05

Dies müsste eigentlich (ich habe es nicht ausprobiert) machen, was du willst:

Code: Alles auswählen

for line in open("bilder"):
    name, url = line.split("#!", 1)
    urllib.retrieve(url, name + ".jpg")
Stefan

PS: Warum dein Code nicht tut, kann ich nur raten. Du speicherst jedenfalls die Bilder nicht binär sondern als Text, was unter Windows nicht funktioniert. Das `seek()` finde ich auch suspekt. Ich denke nicht, dass du pycurl brauchst und auch die while-Schleife mit der überflüssigen Boolschen Variable ist komisch.
Zuletzt geändert von sma am Mittwoch 18. März 2009, 11:33, insgesamt 1-mal geändert.
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Mittwoch 18. März 2009, 11:28

Das klingt für mich nach einem klassichen Fall für ein Shell-Skript.

Code: Alles auswählen

$ cat in | sed -e "s/\#\!/ /" | while read filename url ; do wget -O $filename $url; done
Das hat zwar mit Python nichts zu tun, funkioniert aber.
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Mittwoch 18. März 2009, 11:37

Ich liebe List-Comprehension:

Code: Alles auswählen

import urllib
[urllib.urlretrieve(url, name) for name, url in
    [line.split("#!", 1) for line in
        open("in")]]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 18. März 2009, 11:44

Man sollte aber anmerken dass es nicht der feine Stil ist, LCs nur wegen ihrer Seiteneffekte zu verwenden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Mittwoch 18. März 2009, 11:49

Klar, auch wenn die unschöne Nebenwirkung nur in der äußersten Liste auftritt. Der Aufruf von opne() hat ja auch eine Nebenwirkung, liefert aber das, was benötigt wird . Ein übliches Problem von Funktionaler Programmierung.

Schön ist aber, dass es in Python eben doch mehr als einen Weg gibt :)
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Mittwoch 18. März 2009, 12:10

lutz.horn hat geschrieben:Schön ist aber, dass es in Python eben doch mehr als einen Weg gibt :)
Dass es mehrere Wege gibt hat nie jemand bezweifelt. Es ging um "one *best* way", und lisp-like lc ist sicher nicht sonderlich pythonic.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Mittwoch 18. März 2009, 12:11

lutz.horn hat geschrieben:Klar, auch wenn die unschöne Nebenwirkung nur in der äußersten Liste auftritt. Der Aufruf von opne() hat ja auch eine Nebenwirkung, liefert aber das, was benötigt wird . Ein übliches Problem von Funktionaler Programmierung.
Tritt aber in funktionalen Sprachen nicht auf ;)

Code: Alles auswählen

with open("in") as input:
    for line in input:
         urllib.urlretrieve(*reversed(line.split("#!", 1)))
lunar

Mittwoch 18. März 2009, 12:11

lutz.horn hat geschrieben:Ich liebe List-Comprehension:

Code: Alles auswählen

import urllib
[urllib.urlretrieve(url, name) for name, url in
    [line.split("#!", 1) for line in
        open("in")]]

Code: Alles auswählen

with open('in') as stream:
    for line in stream:
         urllib.urlretrieve(*reversed(line.split('#!', 1)))
Auch nicht länger als dein Code, aber ohne eine überflüssige LC
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Mittwoch 18. März 2009, 12:21

Um Länge und die genaue Anzahl der LCs geht es mir gar nicht. Ich finde lediglich interessant, dass es mit Python eben auch möglich ist, in einem Stil zu programmieren, bei dem die Schachtelung genau umgedreht ist. Das sieht halt mehr nach Lisp aus :)
lunar

Mittwoch 18. März 2009, 12:27

lutz.horn hat geschrieben:Um Länge und die genaue Anzahl der LCs geht es mir gar nicht. Ich finde lediglich interessant, dass es mit Python eben auch möglich ist, in einem Stil zu programmieren, bei dem die Schachtelung genau umgedreht ist.
Deswegen ist das aber noch lange nicht elegant oder überhaupt sinnvoll.
Das sieht halt mehr nach Lisp aus :)
Sieht das hier aus wie ein LISP-Forum? ;)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 18. März 2009, 13:03

lutz.horn hat geschrieben:Das sieht halt mehr nach Lisp aus :)
Finde ich nicht. In Lisp programmiert man über Komposition von Funktionen, du programmierst über Komposition von Syntaktischem Zucker.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

Samstag 21. März 2009, 23:23

Fehler Nummer 1:
In der Datei 'bilder' sind auch URLs zu Bildern anderer Formate als nur 'jpg'. Das heißt Heruntergeladene *.pngs werden natürlich nicht richtig angezeigt, wenn ich sie als *.jpg speichere. Das muss also überdacht werden (z.B. muss der Dateityp übermittelt werden).

Fehler Nummer2:
Ich denke, dass sma mit seiner Behauptung recht hat, dass ich Bilder nicht einfach so als Text speichern kann. Ich muss also eine Methode finden, das Bild direkt binär downzuloaden.

Und eine generelle Frage, weils mir schon häufig in diesem Forum aufgefallen ist: Warum wird so selten auf die Frage direkt geantwortet?
Wenn ich eine Frage bezüglich cURL frage, dann habe ich mir doch dabei was gedacht. Antworten ála "Nutz doch urllib" sind da nicht so sinnvoll. Auch die LISP/bla-Diskussion ist ziemlich OT und hilft nichtmal ansatzweise zur Lösung des Problems.

Dennoch danke ich euch, dass ihr euch die Zeit genommen habt.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Sonntag 22. März 2009, 00:58

Du hast in deinem Post nicht erwähnt, wieso du Curl benutzen willst - man geht dann davon aus, dass du urllib nicht kennst.

Die Daten von urlretrieve sind binär, wenn du auch binäre Daten haben möchtest, Bilder zum Beispiel.

Die Sache mit der Dateiendung lässt sich auch simpel lösen. Du schaust dir vorher die URL an und splittest die Endung (dafür gibts auch eine Funktion in urllib). Die hängst du dann hinten an...

filename + ext --> Das was du haben willst.

Ich versteh nicht, wieso du gleich so stark angreifst...
Antworten