Heim > Artikel > Backend-Entwicklung > Python lädt große Dateien herunter. Welche Methode ist schneller?
Normalerweise verwenden wir zum Herunterladen die Anforderungsbibliothek. Diese Bibliothek ist sehr praktisch.
Verwenden Sie den folgenden Streaming-Code. Die Python-Speichernutzung erhöht sich unabhängig von der Größe der heruntergeladenen Datei nicht:
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
Wenn Sie eine Chunk-Codierung benötigen, sollten Sie den Parameter chunk_size nicht übergeben, und sollten dies auch tun Es gibt ein Wenn-Urteil.
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] Die Funktion selbst kann auch dekodiert werden, übergeben Sie einfach den Parameter decode_unicode = True. Durchsuchen Sie außerdem den oberen Python-Hintergrund des offiziellen Kontos und antworten Sie mit „Erweitert“, um ein Überraschungsgeschenkpaket zu erhalten.
Bitte beachten Sie, dass die Anzahl der mit iter_content zurückgegebenen Bytes nicht genau chunk_size ist, sondern eine Zufallszahl, die normalerweise größer ist und voraussichtlich bei jeder Iteration variiert.
Verwenden Sie Response.raw[2] und 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
Dadurch wird die Datei auf die Festplatte gestreamt, ohne zu viel Speicher zu verbrauchen, und der Code ist sauberer. Einfach.
Hinweis: Laut Dokumentation wird Response.raw nicht dekodiert, sodass Sie die Methode r.raw.read bei Bedarf manuell ersetzen können.
response.raw.read = functools.partial(response.raw.read, decode_content=True)
Methode zwei ist schneller. Wenn Methode eins 2–3 MB/s beträgt, kann Methode zwei fast 40 MB/s erreichen.
[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 #shutil.copyfileobj
Das obige ist der detaillierte Inhalt vonPython lädt große Dateien herunter. Welche Methode ist schneller?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!