Python 2.7: получить размер файла только из его дескриптора (а не его пути)
Я пишу функцию, которая должна делать что-то с файлом, основываясь на размере файла (в байтах). Я хотел бы минимизировать количество параметров, передаваемых в функцию, поэтому я бы только передал дескриптор в уже открытый файл и позволил функции получить размер.
Есть ли элегантный способ сделать это?
Я пробовал следующее, С os.path.getsize(os.path.abspath(file_id)), но это не работает:
def datafile_profiler(file_id):
filesize = os.path.getsize(os.path.abspath(file_id))
#[...] continue doing things with the file, based on the size in bites
return stuff
И далее, из "главного кода"
file_id = open(filepath, "rb")
stuff = datafile_profiler(file_id)
file_id.close()
Любое предложение (также совершенно другой подход) только приветствовать.
Благодарность.
3 ответов:
Вы можете сделать что-то очень похожее, например:
filesize = os.path.getsize(file_id.name)Это будет работать только с объектами
file, созданными с помощьюopen()или аналогичных функций, и которые хранят локальное имя файла. Если в какой-то момент Вы измените каталоги или другой процесс заменит файл чем-то другим, имя файла больше не будет указывать на тот же файл, что и Объектfile.Еще один способ получить размер объекта file, который позволяет избежать вышеуказанных проблем:
os.fstat(file_id.fileno()).st_size
Имхо, самый простой способ сделать то, что вы хотите, не используя имя, - это использовать seek and tell. Давайте рассмотрим это на примере.
def get_file_size(fd): fd.seek(0,2) return fd.tell()Там fd - файловый дескриптор. это может быть идентификатор, полученный с помощью open или даже StringIO. это сработает в любом случае.
fileобъекты имеют свойствоname, поэтому вы можете написать:filesize = os.path.getsize(file_id.name)
Comments