2011-09-12 4 views
107

로컬 파일을 처리 할 때 내가하는 일은 상당히 간단하지만 원격 URL로이 작업을 시도 할 때 문제가 발생합니다.Python의 URL에서 이미지 데이터를 읽으려면 어떻게해야합니까?

기본적으로 URL에서 가져온 파일에서 PIL 이미지 개체를 만들려고합니다. 물론 URL을 가져 와서 임시 파일에 저장 한 다음 이미지 객체로 열 수는 있지만 매우 비효율적입니다.

여기에 내가 가진 무엇 :

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

을하지만 그 중 하나가 작동하지 않았다 :

Image.open(urlopen(url)) 

그것은 플레이크 아웃 그럼 내가이 시도, seek() 사용할 수없는 불평. 이를 수행하는 더 좋은 방법이 있습니까, 아니면 임시 파일에 이런 종류의 일을 수행하는 허용 된 방법을 쓰고 있습니까?

+0

도 참조 : (http://stackoverflow.com/q/8286352/562769) –

답변

145

당신이 StringIO

import urllib, cStringIO 

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

감사합니다 [? 어떻게 로컬 누구의 URL 주소를 이미 알고 파이썬을 사용하여 이미지를 저장, 것 마치 똑같은 코드가 파이썬 3에서 urllib2 (Python2와 함께) – sofly

+8

과 함께 작동한다는 것을 추가하는 것과 같습니다. urllib.request에서 가져올 것입니다. urlopen과 StringIO 대신 io.io.BytesIO가됩니다. – matyas

27

사용 StringIO는 파일 - 류의 객체로 읽기 문자열을 켭니다 :

from StringIO import StringIO 
import urllib 

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

내가 요청 라이브러리를 사용을 사용하여 시도 할 수 있습니다. 그것은 더 튼튼한 것 같습니다.

from PIL import Image 
import requests 
from StringIO import StringIO 

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

몇 가지 이유로 urllib가 URL,하지만 요청이 실패한 곳에서 작동했습니다. – mirri66

+0

PIL 패키지를 찾을 수 없지만 베개가 PIL 노력을 대신하여 'pip3.4 install pillow'로 python3에 설치할 수 있습니다. – disruptive

+2

요청이 전체 응답을 메모리에로드 한 다음 PIL이 전체 내용을 이미지로 다시로드하므로 메모리에 두 개의 전체 복사본이있는 것입니다. urllib 메서드를 사용하는 이전 대답은 데이터를 스트리밍하므로 한 복사본에 스트리밍 버퍼 크기를 더한 값으로 끝납니다. 요청으로도 데이터를 스트리밍 할 수 있지만 응답이 read() 의미를 지원하지 않으므로 어댑터를 빌드해야합니다. – sirdodger

110

Python3에서는 StringIO 및 cStringIO 모듈이 없어졌습니다.

Python3에서 사용한다 : 일부 sklearn/NumPy와 사후 처리를하고있는 사람들을 위해

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을 사용하고 있습니다. –

18

(즉 깊은 학습을) 당신이 np.array으로 PIL 객체를 래핑 할 수 있습니다(). 내가했던 것처럼이 Google에있는에서 당신을 저장할 수 있습니다

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))) 
관련 문제