2010-08-01 8 views
4

J'ai un recordset (sqlalchemy) des produits que je suis mise en boucle, et je veux télécharger une image et l'enregistrer dans un dossier.Téléchargement d'une image, souhaitez enregistrer dans le dossier, vérifiez si le fichier existe

Si le dossier n'existe pas, je souhaite le créer.

Aussi, je veux d'abord vérifier si le fichier d'image existe dans le dossier. Si c'est le cas, ne téléchargez pas juste passez cette ligne.

/myscript.py 
/images/ 

Je veux les images dossier à un dossier dans le même répertoire que mon fichier de script, partout où il peut être stocké.

J'ai jusqu'à présent:

q = session.query(products) 

for p in q: 
    if p.url: 
      req = urllib2.Request(p.url) 
      try: 
       response = urllib2.urlopen(req) 
       image = response.read() 

       ??? 
      except URLError e: 
       print e 

Répondre

8

Je pense que vous pouvez simplement utiliser urllib.urlretrieve ici:

import errno 
import os 
import urllib 

def require_dir(path): 
    try: 
     os.makedirs(path) 
    except OSError, exc: 
     if exc.errno != errno.EEXIST: 
      raise 

directory = os.path.join(os.path.dirname(os.path.abspath(__file__)), "images") 
require_dir(directory) 
filename = os.path.join(directory, "stackoverflow.html") 

if not os.path.exists(filename): 
    urllib.urlretrieve("http://stackoverflow.com", filename) 
+0

est-ce que le chemin doit être/images/ou un chemin d'accès complet depuis la racine? – Blankman

+0

Mon exemple utilisera un répertoire appelé 'images' qui réside dans le même répertoire que le fichier de script. – Philipp

+0

En Python 3, utilisez: 'sinon os.path.exists (chemin): os.mkdir (chemin)' à la place. – kenorb

1

Le nom du fichier doit être response.info()['Content-Disposition'] (comme filename=something après un point-virgule dans cette chaîne) - - sinon (cet en-tête est manquant, n'a pas virgule, ou n'a pas partie filename), vous pouvez utiliser urlparse.urlsplit(p.url) et obtenir le os.path.basename du dernier composant non-vierge (ou, plus pragmatiquement mais qui d purent offenser les puristes, juste p.url.split('/')[-1] ;-).

Tellement pour le nom de fichier, appelez-le par ex. fn.

Le répertoire où vit votre script est sd = os.path.dirname(__file__).

Son images sous-répertoire est donc clairement sdsd = os.path.join(sd, 'images').

Pour vérifier si ce sous-répertoire existe, et qu'il en soit autrement,

if not os.path.exists(sdsd): os.makedir(sdsd) 

Pour vérifier si le fichier que vous voulez écrire existe déjà,

if os.path.exists(os.path.join(sdsd, fn)): ... 

Tout ce code va où vous avez ???. C'est beaucoup mieux, il est donc préférable de faire une fonction prenant p.url et response comme arguments (il peut lire image seul ;-) et éventuellement prendre __file__ si vous voulez la liberté de déplacer cette fonction dans son propre module séparé plus tard (je le recommanderais!).

Bien sûr, vous devez import os pour tous les os et os.path appels, et aussi import urlparse si vous décidez d'utiliser ce dernier module de bibliothèque standard.

+0

En Python 3, utilisez: 'sinon os.path.exists (chemin): os.mkdir (chemin)' à la place. – kenorb

Questions connexes