คุณสามารถใช้response.raw
วัตถุไฟล์หรือทำซ้ำมากกว่าการตอบสนอง
หากต้องการใช้response.raw
วัตถุคล้ายไฟล์จะไม่ถอดรหัสการตอบกลับที่ถูกบีบอัด (ด้วย GZIP หรือยุบ) คุณสามารถบังคับให้คลายการบีบอัดสำหรับคุณได้โดยตั้งค่าdecode_content
แอตทริบิวต์เป็นTrue
( requests
ตั้งค่าเป็นFalse
ควบคุมการถอดรหัสเอง) จากนั้นคุณสามารถใช้shutil.copyfileobj()
เพื่อให้ Python สตรีมข้อมูลไปยังวัตถุไฟล์:
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)
หากต้องการวนซ้ำการตอบกลับให้ใช้การวนซ้ำ การวนซ้ำเช่นนี้ทำให้มั่นใจได้ว่าข้อมูลจะถูกขยายโดยขั้นตอนนี้:
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)
นี่จะอ่านข้อมูลในหน่วยจำนวน 128 ไบต์; หากคุณรู้สึกว่าขนาดก้อนอื่นทำงานได้ดีขึ้นให้ใช้Response.iter_content()
วิธีการที่มีขนาดก้อนแบบกำหนดเอง:
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)
โปรดทราบว่าคุณต้องเปิดไฟล์ปลายทางในโหมดไบนารี่เพื่อให้มั่นใจว่าไพ ธ อนไม่ได้พยายามแปลบรรทัดใหม่สำหรับคุณ นอกจากนี้เรายังตั้งค่าstream=True
เพื่อrequests
ไม่ให้ดาวน์โหลดภาพทั้งหมดลงในหน่วยความจำก่อน