Python télécharge des fichiers volumineux, quelle méthode est la plus rapide ?

王林
Libérer: 2023-04-14 21:19:01
avant
2089 Les gens l'ont consulté

Python télécharge des fichiers volumineux, quelle méthode est la plus rapide ?

Habituellement, nous utilisons la bibliothèque de requêtes pour télécharger. Cette bibliothèque est très pratique à utiliser.

Méthode 1

Utilisez le code de streaming suivant, l'utilisation de la mémoire Python n'augmentera pas quelle que soit la taille du fichier téléchargé :

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
Copier après la connexion

Si vous avez besoin d'un encodage de fragments, vous ne devez pas transmettre le paramètre chunk_size, et devez Il y a un jugement 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
Copier après la connexion

iter_content[1] La fonction elle-même peut également être décodée, il suffit de passer le paramètre decode_unicode = True. De plus, recherchez l'arrière-plan Python supérieur du compte officiel et répondez « Avancé » pour obtenir un coffret cadeau surprise.

Veuillez noter que le nombre d'octets renvoyés en utilisant iter_content n'est pas exactement chunk_size, il s'agit d'un nombre aléatoire qui est généralement plus grand et qui devrait varier à chaque itération.

Méthode 2

Utilisez Response.raw[2] et 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
Copier après la connexion

Cela diffuse le fichier sur le disque sans utiliser trop de mémoire, et le code est plus propre et simple.

Remarque : selon la documentation, Response.raw ne décodera pas, vous pouvez donc remplacer manuellement la méthode r.raw.read si nécessaire

response.raw.read = functools.partial(response.raw.read, decode_content=True)
Copier après la connexion

Speed

La deuxième méthode est plus rapide. Si la première méthode est de 2 à 3 Mo/s, la deuxième méthode peut atteindre près de 40 Mo/s.

Références

[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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:51cto.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal