Maison > Article > développement back-end > 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.
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
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
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.
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
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)
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.
[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!