У меня есть класс, который я использую, чтобы отслеживать ход загрузки по FTP (используя ftplib
).
Я использую ftplib
с multiprocessing
для загрузки нескольких файлов одновременно.
Это мой первыйпопытка использования класса в Python, и я сомневаюсь, закрываю ли я файл, который я открыл внутри класса. Ниже приведены фрагменты кода, которые, как мне кажется, подходят:
class track_transfer:
def __init__(self, size, fname):
self.file_name=fname
self.size_in_bytes=size
self.downloaded=0
self.file=open(fname, 'wb')
def __del__(self):
try:
self.file.close()
self.file=None
except:
pass
def update(self):
self.downloaded=self.file.tell()
if self.downloaded==self.size_in_bytes:
self.file.close()
Как вы видите, я пытаюсь закрыть файлы в двух местах: один внутри финализатора, другой в методе класса update()
.
То, что я хотел знать, будет ли мой файл закрыт правильно, когда я использую этот класс?
Или есть лучший способ следовать?
ОБНОВЛЕНИЕ
Я думаю, что я могуздесь нужно предоставить больше информации.
Класс track_transfer имеет другой метод с именем progress (self, data) , определяемый следующим образом:
def progress(self, data):
self.file.write(data)
self.update()
Создание экземпляра classAdded дополнительной информации,
tracker=track_transfer(size=fsize, fname=fname)
и загрузка файла,
ftp.retrbinary("RETR %s" %(fname),
callback=tracker.progress)
, где ftp.retrbinary () - это метод, определенный в библиотеке ftplib получить файл как двоичный файл с FTP-сервера. Это вызовет метод tracker objetc progress при получении блока данных. Это означает, что метод progress () будет вызываться несколько раз при загрузке файла.