Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Python memuat turun fail besar, kaedah manakah yang lebih pantas?

Python memuat turun fail besar, kaedah manakah yang lebih pantas?

王林
王林ke hadapan
2023-04-14 21:19:012038semak imbas

Python memuat turun fail besar, kaedah manakah yang lebih pantas?

Biasanya, kami menggunakan perpustakaan permintaan untuk memuat turun Pustaka ini sangat mudah digunakan.

Kaedah 1

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.

Kaedah 2

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)

Kelajuan

Kaedah 2 lebih cepat. Jika kaedah satu ialah 2-3 MB/s, kaedah dua boleh mencapai hampir 40 MB/s.

Rujukan

[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!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam