2010-08-01 113 views
4

所以我有一個記錄集(sqlalchemy)的產品,我正在循環,我想下載一個圖像並將其保存到一個文件夾。下載圖像,想要保存到文件夾,檢查文件是否存在

如果文件夾不存在,我想創建它。

此外,我想先檢查圖像文件是否存在於文件夾中。 如果有,請不要下載跳過那一行。

/myscript.py 
/images/ 

我想要的圖像文件夾是在同一目錄作爲我的腳本文件,無論它可以存儲一個文件夾。

我到目前爲止有:

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 

回答

8

我想你可以只使用urllib.urlretrieve這裏:

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

該路徑應該是/ images /還是從根目錄的完整路徑? – Blankman 2010-08-01 17:01:50

+0

我的示例將使用一個名爲'images'的目錄,該目錄與腳本文件位於同一目錄中。 – Philipp 2010-08-01 17:31:12

+0

在Python 3中使用:'if not os.path.exists(path):os.mkdir(path)'代替。 – kenorb 2015-07-27 22:52:31

1

的文件名應該是response.info()['Content-Disposition'](如在該字符串分號後filename=something) - - 如果沒有(該標題丟失,沒有分號,或沒有分號),則可以使用urlparse.urlsplit(p.url)並獲取最後一個非空白分量的os.path.basename(或者更實用但不會eeply冒犯純粹主義者,只是p.url.split('/')[-1] ;-)。

這麼多的文件名稱,例如, fn

腳本所在的目錄是sd = os.path.dirname(__file__)

它的images子目錄因此顯然是sdsd = os.path.join(sd, 'images')

要檢查是否該子目錄存在,並使其否則,

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

要檢查文件是否要寫入已存在,

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

所有這些代碼的推移,你必須???。這很多,所以最好把它作爲一個函數,以p.urlresponse作爲參數(它可以自己讀取image;並且可能還需要__file__),如果您希望自由將該函數移動到它自己的單獨模塊中後來(我推薦!)。

當然,你需要import os所有這些osos.path電話,也import urlparse如果你決定使用後者的標準庫模塊。

+0

在Python 3中使用:'if if os.path.exists(path):os.mkdir(path)'代替。 – kenorb 2015-07-27 22:52:36