Bạn có thể sử dụng response.raw
đối tượng tệp hoặc lặp lại qua phản hồi.
Theo response.raw
mặc định, để sử dụng đối tượng giống như tệp, sẽ giải mã các phản hồi được nén (với GZIP hoặc khử rung). Dù sao, bạn có thể buộc nó giải nén cho bạn bằng cách đặt decode_content
thuộc tính thành True
( requests
đặt nó False
thành điều khiển giải mã chính nó). Sau đó, bạn có thể sử dụng shutil.copyfileobj()
để Python truyền dữ liệu đến một đối tượng tệp:
import requests
import shutil
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
Để lặp lại qua phản hồi, sử dụng một vòng lặp; Lặp đi lặp lại như thế này đảm bảo rằng dữ liệu được giải nén theo giai đoạn này:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r:
f.write(chunk)
Điều này sẽ đọc dữ liệu trong khối 128 byte; nếu bạn cảm thấy kích thước khối khác hoạt động tốt hơn, hãy sử dụng Response.iter_content()
phương pháp với kích thước khối tùy chỉnh:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r.iter_content(1024):
f.write(chunk)
Lưu ý rằng bạn cần mở tệp đích ở chế độ nhị phân để đảm bảo python không thử và dịch các dòng mới cho bạn. Chúng tôi cũng thiết lập stream=True
để requests
không tải toàn bộ hình ảnh vào bộ nhớ trước.