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()

Любое предложение (также совершенно другой подход) только приветствовать. Благодарность.

268   3  

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)
    Ничего не найдено.

Добавить ответ:
Отменить.