une - xml python




Obtenir la taille d'un fichier avant de le télécharger en Python (5)

Je télécharge un répertoire entier à partir d'un serveur Web. Cela fonctionne bien, mais je ne peux pas comprendre comment obtenir la taille du fichier avant le téléchargement pour comparer si elle a été mise à jour sur le serveur ou non. Est-ce que cela peut être fait comme si je téléchargeais le fichier à partir d'un serveur FTP?

import urllib
import re

url = "http://www.someurl.com"

# Download the page locally
f = urllib.urlopen(url)
html = f.read()
f.close()

f = open ("temp.htm", "w")
f.write (html)
f.close()

# List only the .TXT / .ZIP files
fnames = re.findall('^.*<a href="(\w+(?:\.txt|.zip)?)".*$', html, re.MULTILINE)

for fname in fnames:
    print fname, "..."

    f = urllib.urlopen(url + "/" + fname)

    #### Here I want to check the filesize to download or not #### 
    file = f.read()
    f.close()

    f = open (fname, "w")
    f.write (file)
    f.close()

@Jon: merci pour votre réponse rapide. Cela fonctionne, mais la taille du fichier sur le serveur Web est légèrement inférieure à la taille du fichier téléchargé.

Exemples:

Local Size  Server Size
 2.223.533  2.115.516
   664.603    662.121

Cela a quelque chose à voir avec la conversion CR / LF?


À l'aide de la méthode info() -urlib-object retournée info() , vous pouvez obtenir diverses informations sur le document renvoyé. Exemple de saisie du logo Google actuel:

>>> import urllib
>>> d = urllib.urlopen("http://www.google.co.uk/logos/olympics08_opening.gif")
>>> print d.info()

Content-Type: image/gif
Last-Modified: Thu, 07 Aug 2008 16:20:19 GMT  
Expires: Sun, 17 Jan 2038 19:14:07 GMT 
Cache-Control: public 
Date: Fri, 08 Aug 2008 13:40:41 GMT 
Server: gws 
Content-Length: 20172 
Connection: Close

C'est un dict, donc pour obtenir la taille du fichier, vous faites urllibobject.info()['Content-Length']

print f.info()['Content-Length']

Et pour obtenir la taille du fichier local (pour comparaison), vous pouvez utiliser la commande os.stat ():

os.stat("/the/local/file.zip").st_size


La taille du fichier est envoyée sous la forme de l'en-tête Content-Length. Voici comment l'obtenir avec urllib:

>>> site = urllib.urlopen("http://python.org")
>>> meta = site.info()
>>> print meta.getheaders("Content-Length")
['16535']
>>>

En Python3:

>>> import urllib.request
>>> site = urllib.request.urlopen("http://python.org")
>>> print("FileSize: ", site.length)

Pour une approche python3 (testée sur 3.5), je recommanderais:

with urlopen(file_url) as in_file, open(local_file_address, 'wb') as out_file:
    print(in_file.getheader('Content-Length'))
    out_file.write(response.read())






urllib