Отслеживание прогресса загрузки файла в Python
Вопрос
Многие модули, которые я использую, импортируют целые файлы в память или загружают содержимое файла во время его обработки.Мне интересно, есть ли какой-нибудь способ отслеживать такого рода прогресс загрузки?Возможно, класс-оболочка, который принимает обратный вызов?
Решение
Я бы сделал это, определив размер файла, а затем просто разделив общее количество прочитанных байт.Вот так:
import os
def show_progress(file_name, chunk_size=1024):
fh = open(file_name, "r")
total_size = os.path.getsize(file_name)
total_read = 0
while True:
chunk = fh.read(chunk_size)
if not chunk:
fh.close()
break
total_read += len(chunk)
print "Progress: %s percent" % (total_read/total_size)
yield chunk
for chunk in show_progress("my_file.txt"):
# Process the chunk
pass
Редактировать: Я знаю, что это не самый лучший код, но я просто хотел показать концепцию.
Другие советы
Если вы на самом деле имеете в виду "импортировать" (а не "читать"), то вы можете переопределить определения модуля импорта.Вы можете добавить возможности синхронизации.
Смотрите на чертенок модуль.
Если вы имеете в виду "читать", то вы можете тривиально обернуть файлы Python своей собственной файловой оболочкой.Файлы не предоставляют слишком много методов.Вы можете переопределить интересные из них, чтобы получить временные данные.
>>> class MyFile(file):
... def read(self,*args,**kw):
... # start timing
... result= super(MyFile,self).read(*args,**kw)
... # finish timing
... return result