2011-09-12 5 views
107

Quello che sto cercando di fare è abbastanza semplice quando abbiamo a che fare con un file locale, ma il problema si presenta quando provo a farlo con un URL remoto.Come leggo i dati delle immagini da un URL in Python?

Fondamentalmente, sto cercando di creare un oggetto immagine PIL da un file estratto da un URL. Certo, potrei sempre recuperare l'URL e archiviarlo in un file temporaneo, quindi aprirlo in un oggetto immagine, ma ciò sembra molto inefficiente.

Ecco quello che ho:

Image.open(urlopen(url)) 

si sfalda fuori lamentano che seek() non è disponibile, così poi ho provato questo:

Image.open(urlopen(url).read()) 

Ma che non ha funzionato neanche. C'è un modo migliore per farlo, o sta scrivendo in un file temporaneo il modo accettato di fare questo genere di cose?

+0

Vedere anche: [Come salvare un'immagine in locale utilizzando Python il cui indirizzo URL che già conosco?] (Http://stackoverflow.com/q/8286352/562769) –

risposta

145

si potrebbe provare a utilizzare uno StringIO

import urllib, cStringIO 

file = cStringIO.StringIO(urllib.urlopen(URL).read()) 
img = Image.open(file) 
+0

Grazie, sarebbe voglio solo aggiungere che lo stesso codice esatto funzionerà con urllib2 (con Python2) – sofly

+8

in python 3 sarebbe da urllib.request import urlopen e io.io.BytesIO invece di StringIO – matyas

27

Usa StringIO per accendere la stringa di lettura in un oggetto simile a file:

from StringIO import StringIO 
import urllib 

Image.open(StringIO(urllib.urlopen(url).read())) 
49

Io uso la biblioteca richieste. Sembra essere più robusto.

from PIL import Image 
import requests 
from StringIO import StringIO 

response = requests.get(url) 
img = Image.open(StringIO(response.content)) 
+3

Per qualche motivo urllib non ha funzionato per alcuni URL, ma le richieste hanno funzionato laddove non è riuscito – mirri66

+0

Non sono riuscito a trovare il pacchetto PIL, ma sembra che il cuscino abbia assorbito lo sforzo del PIL e si può installare per python3 con 'pip3.4 install pillow'. – disruptive

+2

Si noti che le richieste caricheranno l'intera risposta in memoria, quindi PIL caricherà di nuovo l'intera immagine come un'immagine, in modo da avere due copie complete residenti in memoria. La risposta precedente che utilizza il metodo urllib trasmette i dati, quindi si finisce con una sola copia più la dimensione del buffer di streaming. È anche possibile eseguire lo streaming dei dati con le richieste, ma poiché la risposta non supporta la semantica read(), è necessario creare un adattatore. – sirdodger

110

In Python3 i moduli StringIO e cStringIO sono spariti.

In python3 si dovrebbe usare:

from PIL import Image 
import requests 
from io import BytesIO 

response = requests.get(url) 
img = Image.open(BytesIO(response.content)) 
+15

Sto usando Pilllow https://pypi.python.org/pypi/Pillow/2.7.0 –

18

Per quelli che fanno un po 'di sklearn/NumPy post-elaborazione (vale a dire l'apprendimento profondo) si può avvolgere l'oggetto PIL con np.array(). Questo potrebbe risparmiare da dover Google è come ho fatto io:

from PIL import Image 
import requests 
import numpy as np 
from StringIO import StringIO 

response = requests.get(url) 
img = np.array(Image.open(StringIO(response.content))) 
Problemi correlati