Дополнительно
Получение размера файла перед загрузкой в Python
Я загружаю целый каталог с веб-сервера. Все работает нормально, но я не могу понять, как получить размер файла до загрузки, чтобы сравнить, был ли он обновлен на сервере или нет. Можно ли это сделать так же, как если бы я загружал файл с 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: спасибо за быстрый ответ. Это работает, но размер файла на веб-сервере немного меньше, чем размер загруженного файла.
Примеры:
Local Size Server Size
2.223.533 2.115.516
664.603 662.121
Это как-то связано с преобразованием CR/LF?
43
7
Я воспроизвел то, что вы видите:
Выводит это:
Что я здесь делаю неправильно? Является ли os.stat () .st_size не возвращающим правильный размер?
Редактировать: Хорошо, я понял, в чем проблема:
это выводит:
Убедитесь, что вы открываете оба файла для двоичного чтения / записи.
Используя метод возвращаемого объекта
info()
, вы можете получить различную информацию о полученном документе. Пример захвата текущего логотипа Google:Это диктант, поэтому, чтобы получить размер файла, вы делаете
urllibobject.info()['Content-Length']
.А чтобы получить размер локального файла (для сравнения), вы можете использовать команду os.stat():
Размер файла передается в заголовке Content-Length. Вот как получить его с помощью urllib:
Также, если сервер, к которому вы подключаетесь, поддерживает его, посмотрите на Etags и заголовки If-Modified-Since и If-None-Match.
Их использование позволит воспользоваться правилами кэширования веб-сервера и вернуть код состояния 304 Not Modified, если содержимое не изменилось.
Решение на основе [запрашивает][1] с использованием HEAD вместо GET (также печатает заголовки HTTP):
В Python3:
Для подхода python3 (проверен на 3.5) я бы порекомендовал: