2015-03-08 34 views
0

任何人都可以幫我解決下載多個文件的問題嗎?有一段時間,它會阻止我IOError並告訴我連接嘗試失敗。我試圖使用time.sleep函數隨機秒數睡覺,但它沒有幫助。當我重新運行代碼時,它開始再次下載文件。任何解決方案使用Urllib下載圖片時出現IO錯誤

IO_Error

import urllib 
import time 
import random 

index_list=["index#1","index#2",..."index#n"] 

for n in index_list: 
    u=urllib.urlopen("url_address"+str(n)+".jpg") 
    data=u.read() 
    f=open("tm"+str(n)+".jpg","wb") 
    f.write(data) 
    t=random.uniform(0,1)*10 
    print "system sleep time is ", t, " seconds" 
    time.sleep(t) 
+1

有什麼確切的錯誤信息? – poke 2015-03-08 20:38:47

+0

剛剛添加我的錯誤屏幕。 – moiaussi06 2015-03-08 20:50:43

+0

你可以用Firefox或Opera等瀏覽器打開它嗎? – User 2015-03-08 20:52:19

回答

0

錯誤很可能是由於未正確關閉連接而導致的(should I call close() after urllib.urlopen()?)。 關閉也是更好的做法,因此您也應該關閉f。 你也可以使用Python的with語句。

import urllib 
import time 
import random 

index_list = ["index#1", "index#2", ..."index#n"] 

for n in index_list: 
    # The str() function call isn't necessary, since it's a list of strings 
    u = urllib.urlopen("url_address" + n + ".jpg") 
    data = u.read() 
    u.close() 
    with open("tm" + n + ".jpg", "wb") as f: 
     f.write(data) 
    t = random.uniform(0, 1) * 10 
    print "system sleep time is ", t, " seconds" 
    time.sleep(t) 

如果仍然出現問題,無法提供更多的信息,您可以嘗試urllib.urlretrieve

+0

在這種情況下,我可以跟進有關函數urllib.urlopen()和urllib.urlretrieve()之間差異的問題嗎?他們是否可以互換? – moiaussi06 2015-03-09 05:19:23

+0

他們非常相似。 'urlopen(...)'返回一個只讀文件對象,而'urlretrieve(...)'返回一個元組''(filename,headers)'。 據我所知,它們可以互換使用,但我會說'urlretrieve(...)'是用於「下載」並寫入磁盤,而「urlopen(...)」用於閱讀內容。 – Liblor 2015-03-09 13:30:58

0

也許你沒有正確關閉連接,所以服務器看到太多打開的連接?嘗試在讀取循環中的數據後執行u.close()。

+0

重新啓動筆記本電腦後,問題消失了。猜猜我只是讓我的筆記本電腦打開太久而無法正常工作。 – moiaussi06 2015-03-09 05:16:22