r.raw(HTTPResponse)已经是一个类似文件的对象(只需传递stream=True):#!/usr/bin/env python
import sys
import requests # $ pip install requests
from PIL import Image # $ pip install pillow
url = sys.argv[1]
r = requests.get(url, stream=True)
r.raw.decode_content = True # Content-Encoding
im = Image.open(r.raw) #NOTE: it requires pillow 2.8+
print(im.format, im.mode, im.size)
一般来说,如果你有一个bytestring;你可以把它包装成f = io.BytesIO(r.content),这样就可以在不接触磁盘的情况下获得一个类似文件的对象:#!/usr/bin/env python
import io
import zipfile
from contextlib import closing
import requests # $ pip install requests
r = requests.get("http://www.pythonchallenge.com/pc/def/channel.zip")
with closing(r), zipfile.ZipFile(io.BytesIO(r.content)) as archive:
print({member.filename: archive.read(member) for member in archive.infolist()})
不能直接将r.raw传递给ZipFile(),因为前者是不可查找的文件。I would like to see if I can circumvent having to code a file deletion line
tempfile可以自动删除文件^{}。直到调用.fileno()方法(如果某些api需要一个真正的文件)或到达maxsize;数据保存在内存中。即使数据写在磁盘上;文件一关闭就被删除。