2011-09-12 22 views
107

Yapmaya çalıştığım şey, yerel bir dosyayla uğraştığımızda oldukça basit, ancak bunu uzak bir URL ile yapmaya çalıştığımda sorun geliyor.Görüntü verilerini Python'daki bir URL'den nasıl okuyabilirim?

Temel olarak, bir URL'den çektiğim bir dosyadan bir PIL görüntü nesnesi oluşturmaya çalışıyorum. Tabii, her zaman URL'yi alıp geçici bir dosyada saklayabilirim, sonra onu bir görüntü nesnesine açabilirim, fakat bu çok verimsiz hissediyor.

İşte ne var:

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

Ama bu da işe yaramadı:

Image.open(urlopen(url)) 

O gevreği dışarı o halde ben bu çalıştı seek() mevcut olmadığını şikayetçi. Bunu yapmak için daha iyi bir yol var mı, yoksa geçici bir dosyaya böyle bir şeyi yapmanın kabul edilen yolunu mu yazıyor?

+0

Ayrıca bakınız: (http://stackoverflow.com/q/8286352/562769) –

cevap

145

Bir StringIO

import urllib, cStringIO 

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

Teşekkür [? Nasıl yerel kimin URL adresi zaten biliyorum Python kullanarak bir görüntüyü kaydetmek için], olur aynı tam kod urllib2 (Python2 ile) python 3'te – sofly

+8

ile çalışacağını eklemek istiyorum. urllib.request import urlopen ve Stringio – matyas

27

kullanın StringIO bir dosya benzeri nesnesine okuma dize açmak için:

from StringIO import StringIO 
import urllib 

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

Ben istekleri kütüphane kullanımı kullanarak deneyebilirsiniz. Daha sağlam görünüyor.

from PIL import Image 
import requests 
from StringIO import StringIO 

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

yerine io.io.BytesIO olacaktır. Bazı nedenlerden dolayı urllib bazıları için çalışmadı. URL'leri, ancak istekleri bu başarısız oldu nerede çalıştı – mirri66

+0

PIL paketi bulamadım, ama yastık PIL çabalarını devraldı ve python3 'pip3.4 yükleme yastık' ile yükleyebilirsiniz gibi görünüyor. – disruptive

+2

İsteklerin tüm yanıtı belleğe yükleyeceğini ve daha sonra PIL öğeyi bir görüntü olarak tekrar yükleyeceğini unutmayın, böylece bellekte saklanan iki tam kopyanız olur. Urllib yöntemini kullanarak önceki cevap verileri akıtır, böylece sadece bir kopya artı akış arabelleği boyutu ile sonuçlanır. Verileri de isteklerle aktarabilirsiniz, ancak yanıt read() semantiklerini desteklemediğinden, bir bağdaştırıcı oluşturmanız gerekir. – sirdodger

110

Python3'te, StringIO ve cStringIO modülleri gitti.

Python3 size kullanmalısınız: Bazı sklearn/numpy sonrası işleme yapıyor olanlar için

from PIL import Image 
import requests 
from io import BytesIO 

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

Pilllow https://pypi.python.org/pypi/Pillow/2.7.0 kullanıyorum –

18

(yani Derin öğrenme) Eğer np.array ile PIL nesneyi sarabilirsiniz(). Benim yaptığım gibi bu Google'a kurtaracak olabilir:

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))) 
İlgili konular