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

王林
Lepaskan: 2023-04-14 21:19:01
ke hadapan
2091 orang telah melayarinya

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
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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)
Salin selepas log masuk

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!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan