Получите размер файла прежде, чем загрузить в Python

43
задан Prashant Kumar 6 July 2013 в 01:43
поделиться

4 ответа

Я воспроизвел то, что Вы видите:

import urllib, os
link = "http://python.org"
print "opening url:", link
site = urllib.urlopen(link)
meta = site.info()
print "Content-Length:", meta.getheaders("Content-Length")[0]

f = open("out.txt", "r")
print "File on disk:",len(f.read())
f.close()


f = open("out.txt", "w")
f.write(site.read())
site.close()
f.close()

f = open("out.txt", "r")
print "File on disk after download:",len(f.read())
f.close()

print "os.stat().st_size returns:", os.stat("out.txt").st_size

Выводы это:

opening url: http://python.org
Content-Length: 16535
File on disk: 16535
File on disk after download: 16535
os.stat().st_size returns: 16861

, Что я делаю неправильно здесь? Является os.stat () .st_size не возвратом корректного размера?

<час>

Редактирование: хорошо, я выяснил, какова проблема была:

import urllib, os
link = "http://python.org"
print "opening url:", link
site = urllib.urlopen(link)
meta = site.info()
print "Content-Length:", meta.getheaders("Content-Length")[0]

f = open("out.txt", "rb")
print "File on disk:",len(f.read())
f.close()


f = open("out.txt", "wb")
f.write(site.read())
site.close()
f.close()

f = open("out.txt", "rb")
print "File on disk after download:",len(f.read())
f.close()

print "os.stat().st_size returns:", os.stat("out.txt").st_size

это производит:

$ python test.py
opening url: http://python.org
Content-Length: 16535
File on disk: 16535
File on disk after download: 16535
os.stat().st_size returns: 16535

Удостоверяются, что Вы открываете оба файла для двоичного чтения-записи.

// open for binary write
open(filename, "wb")
// open for binary read
open(filename, "rb")
26
ответ дан Jonathan Works 26 November 2019 в 22:58
поделиться

Используя returned-urllib-object info(), можно получить различную информацию о retrived документе. Пример захвата текущего логотипа Google:

>>> 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

Это - dict, так для получения размера файла, Вы делаете urllibobject.info()['Content-Length']

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

И получить размер локального файла (для сравнения), можно использовать os.stat () команда:

os.stat("/the/local/file.zip").st_size
23
ответ дан dbr 26 November 2019 в 22:58
поделиться

Также, если сервер, Вы подключаете к поддержкам его, смотрят Завершающие теги и If-Modified-Since и If-None-Match заголовки.

Используя их использует в своих интересах правила кэширования веб-сервера и возвратится 304 Не Измененный код статуса, если содержание не изменилось.

5
ответ дан Jonathan Works 26 November 2019 в 22:58
поделиться

Размер файла отправляется как заголовок Довольной Длины. Вот то, как получить его с urllib:

>>> site = urllib.urlopen("http://python.org")
>>> meta = site.info()
>>> print meta.getheaders("Content-Length")
['16535']
>>>
7
ответ дан Jonathan Works 26 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: