2016-08-21 5 views
-1

Я нашел здесь этот код, который отслеживает ход загрузки. -Есть ли у чтения (размер) встроенный указатель?

import urllib2 

url = "http://download.thinkbroadband.com/10MB.zip" 

file_name = url.split('/')[-1] 
u = urllib2.urlopen(url) 
f = open(file_name, 'wb') 
meta = u.info() 
file_size = int(meta.getheaders("Content-Length")[0]) 
print "Downloading: %s Bytes: %s" % (file_name, file_size) 

file_size_dl = 0 
block_sz = 8192 
while True: 
    buffer = u.read(block_sz) 
    if not buffer: 
     break 

    file_size_dl += len(buffer) 
    f.write(buffer) 
    status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100./file_size) 
    status = status + chr(8)*(len(status)+1) 
    print status, 

f.close() 

Я не вижу размер блока быть изменены в любой момент в цикле while, так, чтобы мне, buffer = u.read(block_sz) должны продолжать читать то же самое снова и снова.

Мы знаем, что этого не происходит, потому что read() в while loop имеет встроенный указатель, который начинает чтение с того места, где вы остановились в прошлый раз?

Что относительно write()? Сохраняет ли он добавление после того, как он был последним, даже несмотря на то, что файл не открывается в режиме добавления?

ответ

1

Файловые объекты и сетевые сокеты и другие формы связи ввода/вывода: потоки данных. Чтение из них всегда производит следующий раздел данных, вызывающий .read() с размером буфера не перезапускает поток с самого начала.

Итак, есть виртуальная «позиция» в потоках, откуда вы читаете.

Для файлов эта позиция называется указателем на файл, и этот указатель продвигается как для чтения, так и для записи. Вы можете изменить позицию, используя seeking, или просто повторно открыв файл. Вы можете задать файловый объект tell и вам текущую позицию.

Для сетевых розеток, однако, вы можете идти только вперед; данные принимаются извне вашего компьютера, и чтение потребляет эти данные.