2013-02-22 10 views
15

Attualmente sto scrivendo uno script che prende un URL di immagine e lo scarica in un file pre-denominato.Quale comando utilizzare al posto di urllib.request.urlrrispondere?

Ecco la parte rilevante del mio codice:

import urllib.request 

urllib.request.urlretrieve(image['url'],p) 

Ci vuole 'url' e lo salva come 'p'.

Secondo la documentazione Python, lo urllib.request.urlretrieve è un'interfaccia legacy e potrebbe essere deprecato in futuro, quindi vorrei evitarlo se possibile, quindi non è necessario riscriverlo al più presto.

Ho cercato di trovare un altro comando che mi permetta di fare command(url,filename), ma non ho ancora avuto fortuna.

Ragazzi, avete qualche buon consiglio su quale comando dovrei usare invece?

Oh, e vorrei anche evitare l'uso di librerie esterne, se possibile.

risposta

17

Sconsigliata è una cosa, potrebbe diventare obsoleto ad un certo punto in futuro è un altro.

Se si adatta alle vostre esigenze, continuerei a utilizzare urlretrieve.

Detto questo, si può farne a meno:

from urllib.request import urlopen 
from shutil import copyfileobj 

with urlopen(image['url']) as in_stream, open(p, 'wb') as out_file: 
    copyfileobj(in_stream, out_file) 
+1

Grazie mille. Non avevo idea che la libreria di shutil esistesse anche :) – Marc2540

+0

Wow, questo ha funzionato magnificamente. Stavo cercando la stessa cosa, ma per piccoli pezzi di audio, e non riuscivo a capire come salvarlo in un file. Non ho trovato 'urlretrieve' per un po ', e non mi sono reso conto che' urlopen' mi avrebbe dato i byte - ho pensato che dovrei cercare un metodo che possa salvare il file, non andare nel file e leggere/salva i bit. Immagino che questa sia una pratica standard con la programmazione, quindi dovrebbe avere senso, ma non ho mai lavorato prima con I/O. Grazie, è molto più semplice di quanto temessi possa essere. –

+0

Grazie per copyfileobj! Il problema con 'urlretrieve' è che non ha modo di determinare l'errore del server (502/404/qualunque). – y0prst

2

can uso urllib2; si probabilmente dovreste usarerequests

urllib è legato

urllib2 è al di là doloroso da usare

+0

Probabilmente avrei dovuto menzionarlo nel corpo del mio post, e non solo i tag, ma sto usando python 3.3 dove urllib2 è stato fuso in urllib. – Marc2540

10

richieste è davvero bello per questo. Ci sono alcune dipendenze per installarlo. Ecco un esempio.

import requests 
r = requests.get('imgurl') 
with open('pic.jpg','wb') as f: 
    f.write(r.content) 
0

ho voluto aggiungere che questo ha funzionato anche su file XML.

0

Un'altra soluzione senza l'uso di shutil e nessun'altra libreria esterna come requests.

+0

Ciao e benvenuto in SO. Risposte solo codice generalmente considerate meno utili. Modifica la tua risposta per aggiungere un contesto e spiegare la tua soluzione. –

Problemi correlati