Простое решение, которое все еще позволяет вам использовать обратный вызов прогресса:
- Использование
BytesIO
файлоподобного объекта для сохранения загруженного файла в память; - Вы должны искать указатель файла обратно к началу файла после его загрузки, прежде чем начать его чтение.
with io.BytesIO() as fl:
sftp.getfo(file_name, fl, callback=printTotals)
fl.seek(0)
df = pd.read_csv(fl, sep=' ')
Хотя с этим решением вы в конечном итоге загрузите файл в памятьдважды.
Лучшее решение - реализовать объект, подобный файлу.Это даже позволит вам загружать и анализировать файл одновременно.
class FileWithProgress:
def __init__(self, fl):
self.fl = fl
self.size = fl.stat().st_size
self.p = 0
def read(self, blocksize):
r = self.fl.read(blocksize)
self.p += len(r)
print(str(self.p) + " of " + str(self.size))
return r
И использовать его как:
with sftp.open(file_name, "rb") as fl:
fl.prefetch()
df = pd.read_csv(FileWithProgress(fl), sep=' ')