Biasanya, kami menggunakan perpustakaan permintaan untuk memuat turun Pustaka ini sangat mudah digunakan.
Gunakan kod penstriman berikut, penggunaan memori Python tidak akan meningkat tanpa mengira saiz fail yang dimuat turun:
def download_file(url): local_filename = url.split('/')[-1] # 注意传入参数 stream=True with requests.get(url, stream=True) as r: r.raise_for_status() with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) return local_filename
Jika anda mempunyai keperluan pengekodan sebahagian , maka parameter chunk_size tidak boleh dimasukkan, dan harus ada penghakiman if.
def download_file(url): local_filename = url.split('/')[-1] # 注意传入参数 stream=True with requests.get(url, stream=True) as r: r.raise_for_status() with open(local_filename, 'w') as f: for chunk in r.iter_content(): if chunk: f.write(chunk.decode("utf-8")) return local_filename
iter_content[1] Fungsi itu sendiri juga boleh dinyahkod, cuma masukkan parameter decode_unicode = True. Selain itu, cari latar belakang Python teratas akaun rasmi dan balas "Lanjutan" untuk mendapatkan pakej hadiah kejutan.
Perhatikan bahawa bilangan bait yang dikembalikan menggunakan iter_content bukanlah saiz_chunk_size, ia ialah nombor rawak yang biasanya lebih besar dan dijangka berubah pada setiap lelaran.
Gunakan Response.raw[2] dan shutil.copyfileobj[3]
import requests import shutil def download_file(url): local_filename = url.split('/')[-1] with requests.get(url, stream=True) as r: with open(local_filename, 'wb') as f: shutil.copyfileobj(r.raw, f) return local_filename
Ini menstrim fail ke cakera tanpa menggunakan terlalu banyak memori dan kodnya lebih ringkas.
Nota: Menurut dokumentasi, Response.raw tidak akan menyahkod, jadi anda boleh menggantikan r.raw.read secara manual jika perlu Kaedah
response.raw.read = functools.partial(response.raw.read, decode_content=True)
Kaedah 2 lebih cepat. Jika kaedah satu ialah 2-3 MB/s, kaedah dua boleh mencapai hampir 40 MB/s.
[1]iter_content: https://requests.readthedocs.io/en/latest/api/#requests.Response.iter_content
[2]Response.raw: https://requests.readthedocs.io/en/latest/api/#requests.Response.raw
[3]shutil.copyfileobj: https://docs.python.org/3/library/shutil.html#shutil.copyfileobj
Atas ialah kandungan terperinci Python memuat turun fail besar, kaedah manakah yang lebih pantas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!