ConnectionResetError: Une connexion existante a dû être fermée par l'hôte distant
Je suis en train de travailler sur un script pour télécharger un groupe de fichiers. J'ai terminé cette, et il fonctionne correctement. Maintenant, j'ai essayé d'ajouter une dynamique impression de la progression du téléchargement.
Pour les petits téléchargements (c'est d' .les fichiers mp4) comme 5MO, la progression fonctionne très bien et le fichier se ferme correctement, entraînant ainsi une complète et travailler de téléchargement .fichier mp4. Pour les gros fichiers, tels que 250 MO et au-dessus, cela ne fonctionne pas correctement, j'obtiens l'erreur suivante:
Et voici mon code:
import urllib.request
import shutil
import os
import sys
import io
script_dir = os.path.dirname('C:/Users/Kenny/Desktop/')
rel_path = 'stupid_folder/video.mp4'
abs_file_path = os.path.join(script_dir, rel_path)
url = 'https://archive.org/download/SF145/SF145_512kb.mp4'
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(abs_file_path, 'wb') as out_file:
eventID = 123456
resp = urllib.request.urlopen(url)
length = resp.getheader('content-length')
if length:
length = int(length)
blocksize = max(4096, length//100)
else:
blocksize = 1000000 # just made something up
# print(length, blocksize)
buf = io.BytesIO()
size = 0
while True:
buf1 = resp.read(blocksize)
if not buf1:
break
buf.write(buf1)
size += len(buf1)
if length:
print('\r[{:.1f}%] Downloading: {}'.format(size/length*100, eventID), end='')#print('\rDownloading: {:.1f}%'.format(size/length*100), end='')
print()
shutil.copyfileobj(response, out_file)
Cela fonctionne parfaitement avec les petits fichiers, mais plus ceux que je reçois l'erreur. Maintenant, je ne reçois PAS l'erreur, cependant, avec de gros fichiers si je commente la progrès indicateur de code:
with urllib.request.urlopen(url) as response, open(abs_file_path, 'wb') as out_file:
# eventID = 123456
#
# resp = urllib.request.urlopen(url)
# length = resp.getheader('content-length')
# if length:
# length = int(length)
# blocksize = max(4096, length//100)
# else:
# blocksize = 1000000 # just made something up
#
# # print(length, blocksize)
#
# buf = io.BytesIO()
# size = 0
# while True:
# buf1 = resp.read(blocksize)
# if not buf1:
# break
# buf.write(buf1)
# size += len(buf1)
# if length:
# print('\r[{:.1f}%] Downloading: {}'.format(size/length*100, eventID), end='')#print('\rDownloading: {:.1f}%'.format(size/length*100), end='')
# print()
shutil.copyfileobj(response, out_file)
Quelqu'un a une idée? C'est la dernière partie de mon projet et je voudrais vraiment être en mesure de voir les progrès. Encore une fois, c'est Python 3.5. Merci pour toute aide!
resp
ET de response
? pour quoi? Une fois que vous avez écrit dans buf
complètement, il semble que vous avez terminé? ou je me trompe? vous pouvez écrire directement à out_file
BTW.En toute honnêteté, je ne sais pas ce que je fais. Mais si je ne comprend pas
shutil.copyfileobj(response, out_file)
ensuite le fichier téléchargé reste 0 octets.juste essayer
out_file.write(buf1)
au lieu de buf.write(buf1)
dans votre boucle. Vous n'avez pas besoin que io.BytesIO
objet.Et avec ça, ai-je toujours besoin
shutil.copyfileobj(response, out_file)
ou devrait-il fonctionner correctement?non, pas besoin de
copyfileobj
. Il serait déjà copié.
OriginalL'auteur Kenny | 2016-12-12
Vous devez vous connecter pour publier un commentaire.
Vous êtes à l'ouverture de votre url à deux reprises, une fois en tant que
response
et une fois queresp
. Avec votre barre de progression des trucs, vous êtes consomment des données, de sorte que lorsque le fichier est copié à l'aide decopyfileobj
, les données est vide (enfin peut-être que c'est inexacte, car il fonctionne pour les petits fichiers, mais vous faites les choses deux fois ici et c'est probablement l'origine de votre problème)Pour obtenir la barre de progression ET de fichier valide ce faire:
Simplifications fait à votre code:
urlopen
, commeresponse
BytesIO
, écrire directement àout_file
OriginalL'auteur Jean-François Fabre