Rumah >pembangunan bahagian belakang >Tutorial Python >Python memuat turun fail besar, kaedah manakah yang lebih pantas?
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!